diff --git a/monad-supply.cabal b/monad-supply.cabal
--- a/monad-supply.cabal
+++ b/monad-supply.cabal
@@ -1,21 +1,22 @@
 Name:          monad-supply
 Build-type:    Simple
-Version:       0.6
+Version:       0.7
 Cabal-Version: >= 1.6
 Synopsis:      Stateful supply monad.
 Description:   Support for computations which consume values from a (possibly infinite) supply.
-License:       OtherLicense
+License:       MIT
 License-file:  LICENSE
 Category:      Control, Data, Monads
 Author:        Geoff Hulette and unknown HaskellWiki contributor(s).
-Maintainer:    Geoff Hulette <ghulette@gmail.com>
+Maintainer:    Geoff Hulette <geoff@hulette.net>
 Stability:     experimental
-Tested-With:   GHC == 7.0.3
+Tested-With:   GHC == 8.2.2
 
 Library
   Exposed-modules: Control.Monad.Supply
   Hs-Source-Dirs:  src
-  Build-Depends:   base >= 4 && < 5,mtl >= 2
+  Build-Depends:   base >= 4 && < 5,
+                   mtl >= 2
   GHC-Options:     -Wall
 
 Source-Repository head
diff --git a/src/Control/Monad/Supply.hs b/src/Control/Monad/Supply.hs
--- a/src/Control/Monad/Supply.hs
+++ b/src/Control/Monad/Supply.hs
@@ -1,12 +1,13 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE FunctionalDependencies #-}
-{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE CPP                        #-}
+{-# LANGUAGE FlexibleInstances          #-}
+{-# LANGUAGE FunctionalDependencies     #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE UndecidableInstances       #-}
 
 -- | Support for computations which consume values from a (possibly infinite)
 -- supply. See <http://www.haskell.org/haskellwiki/New_monads/MonadSupply> for
 -- details.
+
 module Control.Monad.Supply
 ( MonadSupply (..)
 , SupplyT
@@ -18,12 +19,12 @@
 , supplies
 ) where
 
-import Control.Applicative
-import Control.Monad.Identity
-import Control.Monad.State
-import Control.Monad.Error
-import Control.Monad.Reader
-import Control.Monad.Writer
+import           Control.Monad.Except
+import           Control.Monad.Identity
+import           Control.Monad.Reader
+import           Control.Monad.State
+import           Control.Monad.Writer   hiding ((<>))
+import           Data.Semigroup
 
 class Monad m => MonadSupply s m | m -> s where
   supply :: m s
@@ -34,7 +35,7 @@
 newtype SupplyT s m a = SupplyT (StateT [s] m a)
   deriving (Functor, Applicative, Monad, MonadTrans, MonadIO, MonadFix)
 
--- | Supply monad. 
+-- | Supply monad.
 newtype Supply s a = Supply (SupplyT s Identity a)
   deriving (Functor, Applicative, Monad, MonadSupply s, MonadFix)
 
@@ -46,7 +47,7 @@
   exhausted = SupplyT $ gets null
 
 -- Monad transformer instances
-instance (Error e,MonadSupply s m) => MonadSupply s (ErrorT e m) where
+instance (MonadSupply s m) => MonadSupply s (ExceptT e m) where
   supply = lift supply
   peek = lift peek
   exhausted = lift exhausted
@@ -66,16 +67,12 @@
   peek = lift peek
   exhausted = lift exhausted
 
--- | Monoid instance for the supply monad. Actually any monad/monoid pair
--- gives rise to this monoid instance, but we can't write its type like that
--- because it would conflict with existing instances provided by Data.Monoid.
---instance (Monoid a, Monad m) => Monoid (m a) where
-instance (Monoid a) => Monoid (Supply s a) where
+instance Semigroup a => Semigroup (Supply s a) where
+  m1 <> m2 = (<>) <$> m1 <*> m2
+
+instance (Semigroup a, Monoid a) => Monoid (Supply s a) where
   mempty = return mempty
-  m1 `mappend` m2 = do
-    x1 <- m1
-    x2 <- m2
-    return (x1 `mappend` x2)
+  m1 `mappend` m2 = m1 <> m2
 
 -- | Get n supplies.
 supplies :: MonadSupply s m => Int -> m [s]
