diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+0.1.2: [2018.05.04]
+-------------------
+* `semirings` now builds back to
+  GHC-7.4.1.
+* many doc fixes.
+
 0.1.1: [2018.04.20]
 -------------------
 * Remove unused `coerce-util` dependency.
diff --git a/Data/Semiring.hs b/Data/Semiring.hs
--- a/Data/Semiring.hs
+++ b/Data/Semiring.hs
@@ -11,29 +11,28 @@
 {-# OPTIONS_GHC -fno-warn-missing-methods #-}
 
 module Data.Semiring
-  ( Semiring(..)
-  , Ring(..)
+  ( -- * Semiring typeclass
+    Semiring(..)
   , (+)
   , (*)
-  , (-)
   , (^)
-  , minus 
   , foldMapP
   , foldMapT
   , sum
   , prod
   , sum'
   , prod'
+  
+    -- * Ring typeclass 
+  , Ring(..)
+  , (-)
+  , minus 
   ) where 
 
 #if defined(VERSION_constrictor)
-#if MIN_VERSION_constrictor(0,1,1)
 import           Constrictor (Ap(..))
-#else
-import           Control.Monad.Constrictor (Ap(..))
 #endif
-#endif
-import           Control.Applicative (Alternative(..), Applicative(..), Const(..))
+import           Control.Applicative (Alternative(..), Applicative(..), Const(..), liftA2)
 import           Data.Bool (Bool(..), (||), (&&), otherwise, not)
 import           Data.Complex (Complex(..))
 import           Data.Eq (Eq(..))
@@ -50,18 +49,24 @@
 import           Data.HashSet (HashSet)
 import qualified Data.HashSet as HashSet
 #endif
-#if defined(VERSION_containers)
 import           Data.Int (Int, Int8, Int16, Int32, Int64)
+import           Data.Maybe (Maybe(..))
+#if defined(VERSION_containers)
 import           Data.IntMap (IntMap)
 import qualified Data.IntMap as IntMap
 import           Data.IntSet (IntSet)
 import qualified Data.IntSet as IntSet
 import           Data.Map (Map)
 import qualified Data.Map as Map
-import           Data.Maybe (Maybe(..))
 #endif
-import           Data.Monoid (Monoid(..),Dual(..), Endo(..), Alt(..), Product(..), Sum(..))
-import           Data.Ord (Down(..), Ord(..), Ordering(..), compare)
+import           Data.Monoid (Monoid(..),Dual(..), Endo(..), Product(..), Sum(..))
+#if MIN_VERSION_base(4,8,0)
+import           Data.Monoid (Alt(..))
+#endif
+import           Data.Ord (Ord(..), Ordering(..), compare)
+#if MIN_VERSION_base(4,6,0)
+import           Data.Ord (Down(..))
+#endif
 import           Data.Ratio (Ratio)
 import           Data.Semigroup (Max(..), Min(..))
 #if defined(VERSION_containers)
@@ -91,9 +96,7 @@
 import           GHC.Integer (Integer)
 import qualified GHC.Num as Num
 import           GHC.Real (Integral, quot, even)
-#if __GLASGOW_HASKELL__ >= 710
 import           Numeric.Natural (Natural)
-#endif
 import           System.Posix.Types
   (CCc, CDev, CGid, CIno, CMode, CNlink,
    COff, CPid, CRLim, CSpeed, CSsize,
@@ -172,8 +175,10 @@
 -- | The class of semirings (types with two binary
 -- operations and two respective identities). One
 -- can think of a semiring as two monoids of the same
--- underlying type: An commutative monoid and an
--- associative one.
+-- underlying type: A commutative monoid and an
+-- associative monoid. For any type R with a 'Prelude.Num'
+-- instance, the commutative monoid is (R, '(Prelude.+)', 0)
+-- and the associative monoid is (R, '(Prelude.*)', 1).
 --
 -- Instances should satisfy the following laws:
 --
@@ -187,7 +192,7 @@
 --
 -- [/additive commutativity/]
 --     
---     @x '+' y = y '+' x
+--     @x '+' y = y '+' x@
 --
 -- [/multiplicative identity/]
 -- 
@@ -204,25 +209,29 @@
 --
 -- [/annihilation/]
 --
---     @'zero' '*' x = x '*' 'zero' = 'zero'
+--     @'zero' '*' x = x '*' 'zero' = 'zero'@
 
 class Semiring a where
   {-# MINIMAL plus, zero, times, one #-}
-  plus  :: a -> a -> a -- ^ Commutative Additive Operation
-  zero  :: a           -- ^ Additive Unit
-  times :: a -> a -> a -- ^ Associative Multiplicative Operation
-  one   :: a           -- ^ Multiplicative Unit
+  plus  :: a -> a -> a -- ^ Commutative Operation
+  zero  :: a           -- ^ Commutative Unit
+  times :: a -> a -> a -- ^ Associative Operation
+  one   :: a           -- ^ Associative Unit
 
   -- useful for defining semirings over ground types
-  default zero  :: Num.Num a => a
-  default one   :: Num.Num a => a
-  default plus  :: Num.Num a => a -> a -> a
-  default times :: Num.Num a => a -> a -> a
+  default zero  :: Num.Num a => a -- ^ 0
+  default one   :: Num.Num a => a -- ^ 1
+  default plus  :: Num.Num a => a -> a -> a -- ^ '(Prelude.+)'
+  default times :: Num.Num a => a -> a -> a -- ^ '(Prelude.*)'
   zero  = 0
   one   = 1
   plus  = (Num.+)
   times = (Num.*)
 
+-- | The class of semirings with an additive inverse.
+--
+--     @'negate' a '+' a = 'zero'@
+
 class Semiring a => Ring a where
   {-# MINIMAL negate #-}
   negate :: a -> a
@@ -230,6 +239,10 @@
   default negate :: Num.Num a => a -> a
   negate = Num.negate
 
+-- | Substract two 'Ring' values. For any type 'R' with
+-- a 'Prelude.Num' instance, this is the same as '(Prelude.-)'.
+--
+--     @x `minus` y = x '+' 'negate' y@
 minus :: Ring a => a -> a -> a
 minus x y = x + negate y
 
@@ -324,6 +337,7 @@
 instance (Monoid a, Ring a) => Ring (Endo a) where
   negate (Endo f) = Endo (negate f)
 
+#if MIN_VERSION_base(4,8,0)
 instance (Alternative f, Semiring a) => Semiring (Alt f a) where
   zero  = empty
   one   = Alt (pure one)
@@ -332,6 +346,7 @@
 
 instance (Alternative f, Ring a) => Ring (Alt f a) where
   negate = fmap negate
+#endif
 
 instance Semiring a => Semiring (Const a b) where
   zero = Const zero
@@ -406,14 +421,14 @@
 instance Semiring CMode
 instance Semiring CIno
 instance Semiring CDev
-#if __GLASGOW_HASKELL__ >= 710
 instance Semiring Natural
-#endif
 instance Integral a => Semiring (Ratio a)
 deriving instance Semiring a => Semiring (Product a)
 deriving instance Semiring a => Semiring (Sum a)
 deriving instance Semiring a => Semiring (Identity a)
+#if MIN_VERSION_base(4,6,0)
 deriving instance Semiring a => Semiring (Down a)
+#endif
 deriving instance Semiring a => Semiring (Max a)
 deriving instance Semiring a => Semiring (Min a)
 instance HasResolution a => Semiring (Fixed a)
@@ -472,11 +487,11 @@
 instance Ring CMode
 instance Ring CIno
 instance Ring CDev
-#if __GLASGOW_HASKELL__ >= 710
 instance Ring Natural
-#endif
 instance Integral a => Ring (Ratio a)
+#if MIN_VERSION_base(4,6,0)
 deriving instance Ring a => Ring (Down a)
+#endif
 deriving instance Ring a => Ring (Product a)
 deriving instance Ring a => Ring (Sum a)
 deriving instance Ring a => Ring (Identity a)
@@ -520,7 +535,8 @@
     = Map.fromListWith (+)
         [ (plus k l, v * u)
         | (k,v) <- Map.toList xs
-        , (l,u) <- Map.toList ys ]
+        , (l,u) <- Map.toList ys
+        ]
 
 instance Semiring IntSet where
   zero = IntSet.empty
@@ -536,7 +552,8 @@
     = IntMap.fromListWith (+)
         [ (plus k l, v * u)
         | (k,v) <- IntMap.toList xs
-        , (l,u) <- IntMap.toList ys ]
+        , (l,u) <- IntMap.toList ys
+        ]
 
 instance (Semiring a) => Semiring (Seq a) where
   zero = Seq.empty
diff --git a/Data/Semiring/Generic.hs b/Data/Semiring/Generic.hs
--- a/Data/Semiring/Generic.hs
+++ b/Data/Semiring/Generic.hs
@@ -8,7 +8,7 @@
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
 
--------------------------------------------------------------------        ----------
+-----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Semiring.Generic
 -- Copyright   :  (C) 2018 chessai
@@ -21,7 +21,7 @@
 -- This module provides generic deriving tools for semirings and rings for
 -- product-like structures.
 --
--------------------------------------------------------------------        ---------
+----------------------------------------------------------------------------
 
 module Data.Semiring.Generic
   ( 
@@ -93,7 +93,7 @@
   {-# MINIMAL gnegate' #-}
   gnegate' :: f a -> f a
 
--- | Generically generate a 'Semiring' 'zero' for any product-like     type
+-- | Generically generate a 'Semiring' 'zero' for any product-like type
 -- implementing 'Generic'.
 --
 -- It is only defined for product types.
@@ -104,7 +104,7 @@
 gzero :: (Generic a, GSemiring (Rep a)) => a
 gzero = to gzero'
 
--- | Generically generate a 'Semiring' 'one' for any product-like t    ype
+-- | Generically generate a 'Semiring' 'one' for any product-like type
 -- implementing 'Generic'.
 --
 -- It is only defined for product types.
@@ -115,7 +115,7 @@
 gone :: (Generic a, GSemiring (Rep a)) => a
 gone  = to gone'
 
--- | Generically generate a 'Semiring' 'plus' operation for any typ    e
+-- | Generically generate a 'Semiring' 'plus' operation for any type
 -- implementing 'Generic'. It is only defined for product types.
 --
 -- @
@@ -124,7 +124,7 @@
 gplus :: (Generic a, GSemiring (Rep a)) => a -> a -> a
 gplus x y = to $ from x `gplus'` from y
 
--- | Generically generate a 'Semiring' 'times' operation for any ty    pe
+-- | Generically generate a 'Semiring' 'times' operation for any type
 -- implementing 'Generic'. It is only defined for product types.
 --
 -- @
diff --git a/semirings.cabal b/semirings.cabal
--- a/semirings.cabal
+++ b/semirings.cabal
@@ -1,6 +1,6 @@
 name:          semirings
 category:      Algebra, Data, Data Structures, Math, Maths, Mathematics
-version:       0.1.1
+version:       0.1.2
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -86,9 +86,14 @@
   ghc-options: -Wall
 
   build-depends:
-      base >= 2 && < 5
+      base >= 4.5 && < 5
     , integer-gmp
+    , semigroups
+    , transformers
   
+  if impl(ghc < 7.10)
+    build-depends: nats >= 0.1 && < 2
+    
   if impl(ghc >= 7.2)
     exposed-modules:
       Data.Semiring
@@ -97,11 +102,8 @@
     exposed-modules:
       Data.Semiring.Generic
     
-    if impl(ghc < 7.10)
-      build-depends: nats >= 0.1 && < 2
-    
     if flag(constrictor)
-      build-depends: constrictor >= 0.1.1.0 && < 0.2.0.0
+      build-depends: constrictor >= 0.1.1.1 && < 0.2.0.0
     
     if flag(containers)
       build-depends: containers >= 0.3 && < 0.6
