Ragionare sul fatto che l'ereditarietà (o qualsiasi singola caratteristica, in realtà) sia necessaria o meno senza considerare anche il resto della semantica del linguaggio è inutile; stai litigando nel vuoto.
Ciò di cui hai bisogno è una filosofia di progettazione linguistica coerente; il linguaggio deve essere in grado di risolvere elegantemente i problemi per i quali è stato progettato. Il modello per ottenere questo può o non può richiedere l'ereditarietà, ma è difficile giudicarlo senza il quadro generale.
Se, ad esempio, la tua lingua ha funzioni di prima classe, applicazioni a funzioni parziali, tipi di dati polimorfici, variabili di tipo e tipi generici, hai praticamente coperto le stesse basi che avresti con l'ereditarietà OOP classica, ma usando un paradigma diverso.
Se hai un'associazione tardiva, una digitazione dinamica, metodi come proprietà, argomenti di funzioni flessibili e funzioni di prima classe, copri anche gli stessi motivi, ma di nuovo, usando un paradigma diverso.
(Trovare esempi per i due paradigmi descritti è lasciato come esercizio per il lettore.)
Quindi, pensa al tipo di semantica che vuoi, gioca con loro e vedi se sono sufficienti senza ereditarietà. Se non lo sono, puoi decidere di trasferire l'ereditarietà nel mix o decidere che manchi qualcosa.