I wonder if something along the lines of
function Base._promote_typejoin(::Type{S}, ::Type{T}) where {S, T}
_cs(T, S) = (isconcretetype(T) || T ≡ Union{}) && Base.issingletontype(S)
if _cs(T, S) || _cs(S, T)
Union{T, S}
else
typejoin(S, T)
end
end
would work, generalizing the existing cases to the union of a concrete and a singleton type.