Yes, for users! If the possible thrown types are not documented and subject to change, it doesn't do users a service to pretend like there's a strong contract for the thrown error only to have it break down the line. I don't feel it should be taken for granted that more information is always better for the user and that trading against specificity in favor of flexibility is hurting the user in favor of the author—being transparent about what is fixed and what is subject to change is helpful, not harmful.
Changing the underlying type of an error is a major API breaking change, as users of 1.0 who updated to 1.1 would lose any error handling they had for
NSError.
There's definitely a spectrum of how breaking a "breaking change" is (both in terms of raw magnitude, but also in terms of a more squishy 'reasonableness'). Any change in behavior has the potential to break someone who was relying on it. The same can be said for changing the underlying type of an existential or opaque return value—after all, someone could have been dynamically casting to observe the true type—and yet we don't generally expect API authors to vend entirely private, purpose built wrappers to eschew dynamic type information.
Similarly if someone is casting an undocumented error and observing specifics about the returned value, that feels like more reasonable break than someone who saw NSError declared in the function signature and opted to rely on that.
Of course, if someone is already documenting "this function always throws FrobulationFailure when it fails," then sure, getting a compiler error when that changes seems strictly better for both clients and authors, and people who want to get specific about their error types should make use of typed throws instead. But I don't think "people could already be relying on undocumented implementation details" is a great reason for defaulting to typed throws.