If "n mathematics, a join-semilattice (or upper semilattice) is a partially ordered set that has a join (a least upper bound)", shouldn't we have
class PartialOrd a => JoinSemiLattice a where
class PartialOrd a => MeetSemiLattice a where
?
This would have pre-empted the problems reported in #53 and #52.