Java's way of expressing variance is really awkward (even quite popular libraries get their types wrong as a result), arrays are special-cased into unsoundness, Serializable is a total mess where it could be a perfect example of how to use a type system, there are no higher kinds, the exception system is like a second parallel type system (it even has union types, which would be incredibly useful if you could use them in the rest of the language). More than that, the standard library doesn't really use the type system to its full effect, e.g. errors in JDBC are C-style numeric codes, Comparable returns an int for what should be a 3-value enum.
(To answer your question, a type system should be sound unless and until the user explicitly requests otherwise, easy to use, but above all consistent)
(To answer your question, a type system should be sound unless and until the user explicitly requests otherwise, easy to use, but above all consistent)