Assuming you know have a good sense of type 1 and type 2 type piracy, I will try to answer the good and bad in the practice. Type piracy can be bad or should be avoided because it makes code unstable. One may think the code is behaving as it was first conceived, but due to piracy is doing something different. Due to that fact, code becomes dangerous to use or depend on. This is a nightmare in R!
Usually type piracy type 2 can be beneficial if it corrects wrong default behavior. For example, MyStruct should use a different behavior for a standard function because of the implied field or nature. I can then overload the common API to fix that. That is a beneficial aspect of type 2 piracy. Moreover, there are ecosystems that rely and encourage type piracy. For example,
# Module A
abstract type These end
name(obj::These) = error("Method has not been implemente for this struct.")
# Module B
mutable struct MyStruct <: These end
name(obj::MyStruct) = "My Struct Name."
Now people may define <:A.These in any package and the API is consistent. This model is used in JuliaStats (base package StatsBase)