This is probably the easiest way to handle your issue. No need to get carried away with subtypes in every method definition.
abstract type AbstractType end
struct ExampleType1<:AbstractType end
struct ExampleType2<:AbstractType end
struct Concrete{AT<:AbstractType} end
is_same(c1::T, c2::T) where {T<:Concrete} = true
is_same(c1::Concrete, c2::Concrete) = false
c1 = Concrete{ExampleType1}()
c2 = Concrete{ExampleType1}()
@show is_same(c1,c2) # true
c1 = Concrete{ExampleType1}()
c2 = Concrete{ExampleType2}()
@show is_same(c1,c2) # false