diff --git a/Data/BitSet.hs b/Data/BitSet.hs
--- a/Data/BitSet.hs
+++ b/Data/BitSet.hs
@@ -1,9 +1,12 @@
+{-# LANGUAGE FlexibleInstances #-}
+
 module Data.BitSet where
 
 import Control.Applicative
 import Control.Monad (guard)
 import Data.Bits
 import Data.Maybe
+import Data.Semigroup (Max (..), Min (..))
 import Prelude ((==))
 import qualified Prelude as Base
 import Util
@@ -36,3 +39,24 @@
 
 (.&?¬) :: (PartialOrd a, Bits a) => a -> a -> Maybe a
 a .&?¬ b = a .&¬ b <$ guard (b ≤ a)
+
+instance Bits a => Monus (BitSet a) where monus = (.&¬)
+
+{-
+instance {-# OVERLAPPING #-} Bits a => Semigroup (Min (BitSet a)) where Min a <> Min b = Min (a .&. b)
+instance {-# OVERLAPPING #-} Bits a => Semigroup (Max (BitSet a)) where Max a <> Max b = Max (a .|. b)
+
+instance Bits a => Abelian (Min (BitSet a))
+instance Bits a => Abelian (Max (BitSet a))
+
+instance Bits a => Idempotent (Min (BitSet a))
+instance Bits a => Idempotent (Max (BitSet a))
+
+instance Bits a => Monoid (Min (BitSet a)) where
+    mappend = (<>)
+    mempty = Min (complement zeroBits)
+
+instance Bits a => Monoid (Max (BitSet a)) where
+    mappend = (<>)
+    mempty = Max zeroBits
+-}
diff --git a/Relation/Binary/Comparison.hs b/Relation/Binary/Comparison.hs
--- a/Relation/Binary/Comparison.hs
+++ b/Relation/Binary/Comparison.hs
@@ -1,5 +1,4 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}
 
 module Relation.Binary.Comparison where
 
@@ -14,6 +13,7 @@
 import Data.Function (flip, on)
 import Data.Int
 import Data.Maybe
+import Data.Monoid (Sum (..))
 import Data.Ord (Ordering (..))
 import Data.Word
 import Numeric.Natural
@@ -220,3 +220,20 @@
 instance PartialOrd a => PartialOrd (Maybe a) where
     tryCompare = tryCompare `on` maybe (Left ()) Right
 instance Eq a => Eq (Maybe a)
+
+class (Monoid a, Abelian a, PartialOrd a) => Monus a where
+    monus :: a -> a -> a
+
+deriving instance Preord (Sum Natural)
+deriving instance PartialEq (Sum Natural)
+deriving instance PartialOrd (Sum Natural)
+deriving instance Eq (Sum Natural)
+deriving instance Ord (Sum Natural)
+
+instance Monus (Sum Natural) where
+    0 `monus` _ = 0
+    a `monus` 0 = a
+    a `monus` b = (a Prelude.- 1) `monus` (b Prelude.- 1)
+
+(∸) :: Monus (Sum a) => a -> a -> a
+a ∸ b = getSum (Sum a `monus` Sum b)
diff --git a/alg.cabal b/alg.cabal
--- a/alg.cabal
+++ b/alg.cabal
@@ -1,5 +1,5 @@
 name:                alg
-version:             0.2.2.1
+version:             0.2.3.0
 synopsis:            Algebraic structures
 -- description:         
 license:             BSD3
@@ -32,5 +32,6 @@
                      , TypeOperators
                      , ConstraintKinds
                      , PolyKinds
+                     , StandaloneDeriving
                      , GeneralizedNewtypeDeriving
   ghc-options:         -Wall -Wno-partial-type-signatures
