Type.ForAll is currently used for two purposes:
*) To represent the type of a generic method declaration
*) To represent a partially instantiated return type that will be fully instantiated after method checking
The latter usage is a bit clumsy - javac does method type inference in two completely separate rounds, which means there has to be an (indirect) way to communicate results from the former stage to the latter. This role has been taken over by the ForAll class - meaning that when we check a partially instantiated method type against a target, we callback into the ForAll type and finish up inference. This is not very regular and leads to problems when trying to expand the scope of type-inference.