> Now you just get to guess whether, for every class, there is actually a ValidClass that you were supposed to be using, instead of Class.
The type system stops this. You can't pass, e.g. a User to authenticate because it only accepts a ValidUser.
> only make classes for valid objects
Using primitives (String, Int, etc.) for unvalidated input, and custom classes for validated input is fine in many cases. However, sometimes you need to represent data that is in the process of being validated (e.g. when validation takes time, like waiting for a user to validate their email address) and then these intermediate classes arrive.