Funciona por questão de compatibilidade com código legado. Sempre que você usar collections não parametrizadas elas serão compatíveis com qualquer tipo. Isto pode gerar problemas como no exemplo que você deu, e também quando você recebe um objeto desses por parâmetro em um método. Tipo:
O detalhe é que não teria como eles criarem generics sem ter isso. Caso contrário nenhum código escrito para a versão 1.4 poderia rodar na versão 1.5, isto seria um grande problema. Eles evitaram um problema grande, trazendo à tona outro menor. Isto porque basta o programador ser cuidadoso que ele conseguirá evitar a maior parte desses bugs.
Mas vale a discussão, e quando o generics foi introduzido à linguagem houve muita discussão nesse sentido, de que forma um recurso como esses poderia ser implementado, sem perder a compatibilidade e trazendo todos os recursos que trouxe. Dentro das possibilidades acho que eles implementaram da melhor forma.
A mesma discussão acontece quando se fala em adicionar sobrecarga de operadores em Java. Este recurso existe há anos no C++, e há anos se fala em adicionar isso ao java também. Apesar de facilitar muito por um lado para o programador pode causar muitas dores de cabeça também, principalmente para código legado. Na minha opinião este seria um recurso muito bem-vindo à linguagem.