By type
/Controllers
/Events
/Models
By topic
/Comments
/Posts
/Users
By topic, then type
/Comments
/Controllers
/Events
/Models
/Posts
/Controllers
/Events
/Models
/Users
/Controllers
/Events
/Models
Mixed
/Comments
/Controllers
/Events
/Models
/Posts
/Users
At the top level I separate early into two categories: infrastructure and domain. This is where the "not being coupled to the framework" is guarded. In the domain I only separate by context, not topic, not type. A simple "test" for a namespace would be to see if you can use it in a sentence like "How are/is Y defined in the context of X". This takes into account that an idea/entity/vo/concept is represented per context in which it's applicable. For instance, when you have hour tracking in the context of a user "Hours Worked" may have a different representation when in the context of "reporting" or "management".