They are a complicated feature that are designed for a specific thing - ad-hoc overloading. They break down if you want to use them for other modularity stuff, and take up room in the language for a feature that could allow for that _and_ ad-hoc overloading (ie. a module system).
Some things traits don't let you do are defining multiple impls for the same type, or to using them for defining abstract datatypes (which would require them to support implementation hiding).