There are two options to simplify the type system in the fashion you ask for.
Type Inference and Dynamic Typing.
Type Inference
The idea behind type inference is to have the compiler to to figure out the type of your objects for you so your code can be simplified by omitting the type information. It has other advantages as well.
Some popular languages with type inference:
Dynamic Typing
In a dynamically typed language, generics are not needed because you get it for free with the dynamic typing. If you want to understand more about how this simplifies the type system, study up on duck typing. Here's a short intro. to the rational behind duck typing.
Some popular languages with dynamic typing are:
You're right that generics in Java was implemented very poorly. This was by design. Why a crappy generics implementation? When they were doing the designs for Java generics, there were compatibility issues with old code, and extensive changes were needed to existing VMs to implement it. Eventually they gave up and gave Java the deficient implementation is has today.
http://code.stephenmorley.org/articles/java-generics-type-erasure/
http://www.ibm.com/developerworks/java/library/j-jtp01255.html
Why do some claim that Java's implementation of generics is bad?
C++ and C# have a much better generics implementation. Check them out if you want a Java-like language and a similar generics implementation.