diff --git a/Data/Functor/Contravariant.hs b/Data/Functor/Contravariant.hs
--- a/Data/Functor/Contravariant.hs
+++ b/Data/Functor/Contravariant.hs
@@ -48,6 +48,7 @@
   -- * Equivalence Relations
   , Equivalence(..)
   , defaultEquivalence
+  , comparisonEquivalence
 
   -- * Dual arrows
   , Op(..)
@@ -64,6 +65,8 @@
 import Data.Functor.Compose
 import Data.Functor.Reverse
 
+import Data.Semigroup (Semigroup(..), Monoid(..))
+
 #ifdef LANGUAGE_DeriveDataTypeable
 import Data.Typeable
 #endif
@@ -187,6 +190,13 @@
 instance Contravariant Comparison where
   contramap f g = Comparison $ \a b -> getComparison g (f a) (f b)
 
+instance Semigroup (Comparison a) where
+  Comparison p <> Comparison q = Comparison $ mappend p q
+
+instance Monoid (Comparison a) where
+  mempty = Comparison (\_ _ -> EQ)
+  mappend (Comparison p) (Comparison q) = Comparison $ mappend p q
+
 -- | Compare using 'compare'
 defaultComparison :: Ord a => Comparison a
 defaultComparison = Comparison compare
@@ -203,10 +213,20 @@
 instance Contravariant Equivalence where
   contramap f g = Equivalence $ \a b -> getEquivalence g (f a) (f b)
 
+instance Semigroup (Equivalence a) where
+  Equivalence p <> Equivalence q = Equivalence $ \a b -> p a b && q a b
+
+instance Monoid (Equivalence a) where
+  mempty = Equivalence (\_ _ -> True)
+  mappend (Equivalence p) (Equivalence q) = Equivalence $ \a b -> p a b && q a b
+
 -- | Check for equivalence with '=='
 defaultEquivalence :: Eq a => Equivalence a
 defaultEquivalence = Equivalence (==)
 
+comparisonEquivalence :: Comparison a -> Equivalence a
+comparisonEquivalence (Comparison p) = Equivalence $ \a b -> p a b == EQ
+
 -- | Dual function arrows.
 newtype Op a b = Op { getOp :: b -> a }
 #ifdef LANGUAGE_DeriveDataTypeable
@@ -219,3 +239,43 @@
 
 instance Contravariant (Op a) where
   contramap f g = Op (getOp g . f)
+
+instance Semigroup a => Semigroup (Op a b) where
+  Op p <> Op q = Op $ \a -> p a <> q a
+
+instance Monoid a => Monoid (Op a b) where
+  mempty = Op (const mempty)
+  mappend (Op p) (Op q) = Op $ \a -> mappend (p a) (q a)
+
+instance Num a => Num (Op a b) where
+  Op f + Op g = Op $ \a -> f a + g a
+  Op f * Op g = Op $ \a -> f a * g a
+  Op f - Op g = Op $ \a -> f a - g a
+  abs (Op f) = Op $ abs . f
+  signum (Op f) = Op $ signum . f
+  fromInteger = Op . const . fromInteger
+
+instance Fractional a => Fractional (Op a b) where
+  Op f / Op g = Op $ \a -> f a / g a
+  recip (Op f) = Op $ recip . f
+  fromRational = Op . const . fromRational
+
+instance Floating a => Floating (Op a b) where
+  pi = Op $ const pi
+  exp (Op f) = Op $ exp . f
+  sqrt (Op f) = Op $ sqrt . f
+  log (Op f) = Op $ log . f
+  sin (Op f) = Op $ sin . f
+  tan (Op f) = Op $ tan . f
+  cos (Op f) = Op $ cos . f
+  asin (Op f) = Op $ asin . f
+  atan (Op f) = Op $ atan . f
+  acos (Op f) = Op $ acos . f
+  sinh (Op f) = Op $ sinh . f
+  tanh (Op f) = Op $ tanh . f
+  cosh (Op f) = Op $ cosh . f
+  asinh (Op f) = Op $ asinh . f
+  atanh (Op f) = Op $ atanh . f
+  acosh (Op f) = Op $ acosh . f
+  Op f ** Op g = Op $ \a -> f a ** g a
+  logBase (Op f) (Op g) = Op $ \a -> logBase (f a) (g a)
diff --git a/contravariant.cabal b/contravariant.cabal
--- a/contravariant.cabal
+++ b/contravariant.cabal
@@ -1,6 +1,6 @@
 name:          contravariant
 category:      Control, Data
-version:       1.0
+version:       1.1
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
@@ -32,6 +32,7 @@
 library
   build-depends:
     base < 5,
+    semigroups >= 0.15.2 && < 1,
     transformers >= 0.2 && < 0.5,
     transformers-compat >= 0.3 && < 1
 
