Check out a previous answer of mine on this topic:
Both your approaches (Fluid{:Water} and Water <: Fluid) encode Water into the type-system — and I’m not sure there’s a big semantic difference between the two. I think I’d prefer the abstract/struct one if that’s going to be the way you go… but you may want to consider if you actually need this encoded in the type system in the first place.