After trying some near examples and the docs, I have not yet made the Broadcasting API do this. More explicit guidance is appreciated.

```
abstract type OtherAbstractFloat <: AbstractFloat end
primitive type Float64a <: OtherAbstractFloat 64 end
primitive type Float64b <: OtherAbstractFloat 64 end
const Float64s = Union{Float64, Float64a, Float64b}
const MaybeFloat64s = Union{Missing, Float64, Float64a, Float64b}
# Float64a, Float64b work like Float64; show with '\^a', '\^b'
Base.Float64(x::T) where {T<:OtherAbstractFloat} = reinterpret(Float64, x)
Float64a(x::Float64) = reinterpret(Float64a, x)
Float64b(x::Float64) = reinterpret(Float64b, x)
Base.show(io::IO, x::Float64a) = print(io, string(Float64(x),"ᵃ"))
Base.show(io::IO, x::Float64b) = print(io, string(Float64(x),"ᵇ"))
square(x::T) where {T<:AbstractFloat} = T(Float64(x)^2)
square(x::Missing) = missing
testvec1 = Float64s[Float64(1.0), Float64a(2.0), Float64b(3.0)]
testvec2 = MaybeFloat64s[Float64(1.0), Float64a(2.0), missing]
# this happens without using the Broadcasting API
square.(testvec1)
3-element Array{AbstractFloat,1}:
1.0
4.0ᵃ
9.0ᵇ
square.(testvec2)
3-element Array{Any,1}:
1.0
4.0ᵃ
missing
# I want to obtain
square.(testvec1) # 3-element Array{Float64s,1}
3-element Array{Union{Float64, Float64a, Float64b},1}:
1.0
4.0ᵃ
9.0ᵇ
square.(testvec2) # 3-element Array{MaybeFloat64s,1}
3-element Array{Union{Missing, Float64, Float64a, Float64b},1}:
1.0
4.0ᵃ
missing
```