Sort of maybe it’s complicated.
So, “traditional” inheritance has two specific advantages over newtypes.
First, you don’t have to write fn foo(&self) { self.thingBeingWrapped.foo(); } for every single method you want to “inherit” the implementation of. This is purely a convenience thing, and in Rust we will probably someday provide this same convenience with a feature called “delegation” that just generates these trivial wrappers for you, so it should be nice and orthogonal to everything else.
Second, inheritance creates a subtype of the base class, while newtyping does not. This is the far more interesting difference, but also where most of the complexity and downsides of traditional inheritance come from.
While both of these arguably make certain things “simpler”, I don’t think either has a significant impact on the fundamental problem of wanting T to implement trait/interface IFoo yet not being able to write that impl yourself. In any of these languages, you still have to talk to whoever owns T to make that happen, or write another type that wraps T. It’s true that inheritance sometimes lets you write this other type in a very concise way, but that carries a lot of complicated baggage, will become a moot point as soon as we figure out “delegation”, and even in today’s Rust custom derives can already make some newtypes more convenient to write than they would be in other languages where macros are absent or dangerous.
I don’t think we can really make progress on this part of the issue without examing concrete examples of situations where the obvious newtype is difficult or impossible to write. Off the top of my head, I’m simply not aware of any case that would not be equally impossible in any other language.