Tangent(0.3 spec) uses something akin to this. (disclaimer: this is my own little research project)
with acts as a union operator modelling inheritance, though pragmatism has made it not commutative. Once you introduce implementations to methods, a strict union of methods with the same name is often not what you want and impossible to do right anyways.
intersect is supported that models type inference for something like
foo(T,T) where the parameters are different.
Complements were interesting, but led to partial types that seemed not so useful and/or troublesome to include correctly - so are not included.
I know there are a few other research languages I ran across that had something similar, but cannot remember them at the moment. The main issue is that the things aren't really useful without structural typing, which isn't terribly popular itself. The other is that you need some sort of kind (type of types) to store the constructed type, or else it's just shorthand for something that isn't particularly idiomatic without that capability. And that's far less common than even structural typing.
It's biased, and it's not much, but there it is.