Multiple dispatch unexpected function call

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

Sorry for bothering you all again. I believe the method

is_same(c1::Concrete{T}, c2::Concrete{T}) where T = true

from here should be marked as ‘unreachable’ or ‘dead code’ by the compiler.