“Single inheritance taxonomies are an anti-pattern.”
“It could be composition all the way down”
Traits give you what you call composition. Very often, classes will be the location where people assemble traits.
“Using class, you’re forced to use `new`, which could break calling code if you need to refactor to a different instantiation method later.”
You are lucky if refactoring from a class instantiated via `new` to a function call is the biggest change in your code (most refactorings are much more tricky). Modern IDEs allow you to completely and safely automate such a refactoring. For my own code, I wouldn’t mind. For libraries, it is indeed something you need to consider. But you do have the option of returning an object from a class constructor (turning it into a factory).