let f x = x in (f true, f 1)
If the type of f is not generalized to (forall a. a -> a) before used in the body, it will not type check.
Unfortunately, in my source code I cannot find any examples where any locally bound identifier should be generalized.
Why have all this machinery for generalization?
Actually, given more detailed type information for the arguments of f, it is substantially more trivial to generate faster code for f. So that's a good argument against generalization.