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...
[1] http://en.wikipedia.org/wiki/Cayenne_(programming_language)