Dependent typing has some interesting things to say about modules, or lack thereof. Cayenne[1] is a functional language that doesn't have modules as its type system is expressive enough to cope with the necessary encapsulation -- you can create the module structure just by using types.
Unfortunately, dependent types make typechecking undecidable so there are drawbacks to this approach...
Unfortunately, dependent types make typechecking undecidable so there are drawbacks to this approach...
[1] http://en.wikipedia.org/wiki/Cayenne_(programming_language)