Raisonner si l'héritage (ou n'importe quelle caractéristique unique, vraiment) est nécessaire ou non sans considérer également le reste de la sémantique du langage est inutile; vous vous disputez dans le vide.
Ce dont vous avez besoin, c'est d'une philosophie de conception de langage cohérente; la langue doit pouvoir résoudre avec élégance les problèmes pour lesquels elle est conçue. Le modèle pour y parvenir peut ou non nécessiter un héritage, mais il est difficile de juger cela sans une vue d'ensemble.
Si, par exemple, votre langage a des fonctions de première classe, une application de fonction partielle, des types de données polymorphes, des variables de type et des types génériques, vous avez à peu près couvert les mêmes bases que vous auriez avec l'héritage OOP classique, mais en utilisant un paradigme différent.
Si vous avez une liaison tardive, un typage dynamique, des méthodes en tant que propriétés, des arguments de fonction flexibles et des fonctions de première classe, vous couvrirez également les mêmes motifs, mais encore une fois, en utilisant un paradigme différent.
(Trouver des exemples pour les deux paradigmes décrits est laissé comme un exercice pour le lecteur.)
Alors, pensez au type de sémantique que vous voulez, jouez avec eux et voyez si elles sont suffisantes sans héritage. Si ce n'est pas le cas, vous pouvez soit décider de jeter l'héritage dans le mix, soit décider qu'il manque quelque chose d'autre.