Miles Sabin describes a very nice way to get union type in his recent blog post Unboxed union types in Scala via the Curry-Howard isomorphism:

He first defines negation of types as

`type ¬[A] = A => Nothing `

using De Morgan's law this allows him to define union types

`type ∨[T, U] = ¬[¬[T] with ¬[U]] `

With the following auxiliary constructs

`type ¬¬[A] = ¬[¬[A]] type |∨|[T, U] = { type λ[X] = ¬¬[X] <:< (T ∨ U) } `

you can write union types as follows:

`def size[T : (Int |∨| String)#λ](t : T) = t match { case i : Int => i case s : String => s.length } `