The first good reason that springs to mind is the lack of an explicit cast (Foo) in:
Class<Foo> cls = Foo.class;
Foo f = cls.newInstance()
thus preventing mistakes like the following (pre-Generics)
Class cls = Date.class;
String s = (String) cls.newInstance();
Even if you don't know what sort of class you have, the Class.asSubclass method can be used in a nice way:
Class<?> cls = Class.forName(someFooSubclassName);
// The following is checked at runtime
Class<? extends Foo> fooCls = cls.asSubclass(Foo.class);
Foo f = fooCls.newInstance();
And not an 'unchecked' warning in sight...
Alex