Ahh I skim read the “existing package” part
You can’t redefine an existing type in another package, it’s not a thing. You need to use holy traits instead. You can even do that with existing abstract types, which could be something like:
category(::Animal) = Animal
category(::Dog) = Mammal
somemethod(animal::Animal) = somemethod(category(animal), animal)
somemethod(::Type{<:Mammal}, animal) = ...
somemethod(::Type{<:Animal}, animal) = ... # fallback