typeof(Int64) and typeof(Float64) are both DataType, but Int64 isa Type{Int64} while !(Float64 isa Type{Int64}) and I would expect nothing besides the type of a value be utilized in the isa opperation. So I ask, are Int64 and Float64 of the same type?
I think the answer is a clear: Well yes but actually no It depends on the context.
Both are technically instances of DataType as shown by typeof meaning they have the same data layout.
However in practice, one often wants to differentiate between types (e.g. for specialization) and so there is a another way you can view them: As singleton instances of Type{T}. I think this is really a special case for the isa operator and does not really follow the conventional rules. This is somewhat explained in the manual here: https://docs.julialang.org/en/v1/manual/types/#man-typet-type
So in some technical sense there are instances of the same type, but in a type theory sense they are singleton instances of an appropriate Type{T} and both things hold simultaneously.
I guess Julia does have concrete subtyping. DataType is a concrete type, and Type{Int} is a subtype. The tricky/impossible thing to do efficiently and what Julia lacks is to be able to define a new concrete type that subtypes an existing concrete type and has a different data layout.