Avere un super-tipo più generico, prendiamo l'esempio di Animale e poi Gatto/Cane/ecc..., è utile per sfruttare il polimorfismo. Pensa ad esempio ad un metodo che riceve (o restituisce) un Animale[] o List<Animale>. Possono contenere qualunque cosa che deriva da Animale e magari il metodo ha bisogno solo di "vedere" gli oggetti come Animale e non come uno dei tipi più specifici.
Il punto in questi casi è: dato uno scenario in cui hai uno o più oggetti "visti" solo come il super-tipo (Animale), PERCHE' hai bisogno di fare operazioni che sono specifiche delle sotto-classi? Se è un caso particolare, ci sono motivi validi o cose del genere, allora può aver senso. Se invece ti trovi ad aver molto o continuamente bisogno di operazioni specifiche dei sotto-tipi, allora o la tua gerarchia è "disegnata" male oppure stai cercando di fare delle cose che sarebbe meglio risolvere in modo differente.