Discussions for this started on the mailing list, and the plan was finalized in phone discussions between DavidLutterkort and LukeKanies.
The interpreter needs to attempt to auto-load modules when missing classes are encountered. The autoloading will be based on a convention that maps class names to modules and file names: The first segment of the class will always be considered the module name, and the rest of the class name will be converted to a path within the module. For instance, the class ssh::client will get interpreted as client.pp in the ssh module.
All attempts at autoloading will first load the module (ssh, in our example), and then attempt to load the specific class only if it does not now exist. This enables users to add all classes to the module's main init.pp manifest while still autoloading classes that lie outside that file.
Implementation should be straightforward, involving a hook in the interpreter where missing classes throw an error, and then a method that knows how to autoload appropriately.