diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,10 @@
-* 0.3.3.5 03 Dec 2014
+* 0.4: 19 April 2015
+
+  - add derived instances where possible:
+    Typeable, Data, Read, Eq, Ord, Functor, Foldable, Traversable
+  - allow base-4.8
+
+* 0.3.3.5: 03 Dec 2014
 
   - allow semigroups-0.15
 
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,7 @@
-Copyright (c) 2012-2013, monoid-extras team:
+Copyright (c) 2012-2015, monoid-extras team:
 
   Daniel Bergey <bergey@alum.mit.edu>
+  Christopher Chalmers <c.chalmers@me.com>
   Nathan van Doorn <nvd1234@gmail.com>
   Daniil Frumin <difrumin@gmail.com>
   Hans Höglund <hans@hanshoglund.se>
diff --git a/monoid-extras.cabal b/monoid-extras.cabal
--- a/monoid-extras.cabal
+++ b/monoid-extras.cabal
@@ -1,5 +1,5 @@
 name:                monoid-extras
-version:             0.3.3.5
+version:             0.4.0.0
 synopsis:            Various extra monoid-related definitions and utilities
 description:         Various extra monoid-related definitions and utilities,
                      such as monoid actions, monoid coproducts, \"deletable\"
@@ -13,6 +13,7 @@
 category:            Data
 build-type:          Simple
 cabal-version:       >=1.10
+tested-with:         GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.1
 
 source-repository head
   type: git
@@ -31,7 +32,7 @@
                      Data.Monoid.Split,
                      Data.Monoid.WithSemigroup
 
-  build-depends:     base >= 4.3 && < 4.8,
+  build-depends:     base >= 4.3 && < 4.9,
                      groups < 0.5,
                      semigroups >= 0.8 && < 0.17,
                      semigroupoids >= 4.0 && < 5
diff --git a/src/Data/Monoid/Action.hs b/src/Data/Monoid/Action.hs
--- a/src/Data/Monoid/Action.hs
+++ b/src/Data/Monoid/Action.hs
@@ -28,13 +28,13 @@
 --
 --   * @act mempty = id@
 --
---   * @act (m1 ``mappend`` m2) = act m1 . act m2@
+--   * @act (m1 \`mappend\` m2) = act m1 . act m2@
 --
 --   Semigroup instances are required to satisfy the second law but with
 --   ('<>') instead of 'mappend'.  Additionally, if the type @s@ has
 --   any algebraic structure, @act m@ should be a homomorphism.  For
 --   example, if @s@ is also a monoid we should have @act m mempty =
---   mempty@ and @act m (s1 ``mappend`` s2) = (act m s1) ``mappend``
+--   mempty@ and @act m (s1 \`mappend\` s2) = (act m s1) \`mappend\`
 --   (act m s2)@.
 --
 --   By default, @act = const id@, so for a type @M@ which should have
diff --git a/src/Data/Monoid/Coproduct.hs b/src/Data/Monoid/Coproduct.hs
--- a/src/Data/Monoid/Coproduct.hs
+++ b/src/Data/Monoid/Coproduct.hs
@@ -1,12 +1,12 @@
-{-# LANGUAGE TypeOperators
-           , FlexibleInstances
-           , MultiParamTypeClasses
-  #-}
+{-# LANGUAGE DeriveDataTypeable    #-}
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeOperators         #-}
 
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Monoid.Coproduct
--- Copyright   :  (c) 2011 diagrams-core team (see LICENSE)
+-- Copyright   :  (c) 2011-2015 diagrams-core team (see LICENSE)
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
@@ -23,8 +23,9 @@
 
        ) where
 
-import Data.Either (lefts, rights)
+import Data.Either        (lefts, rights)
 import Data.Semigroup
+import Data.Typeable
 
 import Data.Monoid.Action
 
@@ -34,7 +35,7 @@
 --   concatenation, with appropriate combining of adjacent elements
 --   when possible.
 newtype m :+: n = MCo { unMCo :: [Either m n] }
-                  deriving Show
+  deriving (Typeable, Show)
 
 -- For efficiency and simplicity, we implement it just as [Either m
 -- n]: of course, this does not preserve the invariant of strictly
diff --git a/src/Data/Monoid/Cut.hs b/src/Data/Monoid/Cut.hs
--- a/src/Data/Monoid/Cut.hs
+++ b/src/Data/Monoid/Cut.hs
@@ -1,8 +1,12 @@
-
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable     #-}
+{-# LANGUAGE DeriveFunctor      #-}
+{-# LANGUAGE DeriveTraversable  #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports       #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Monoid.Cut
--- Copyright   :  (c) 2012 diagrams-core team (see LICENSE)
+-- Copyright   :  (c) 2012-2015 diagrams-core team (see LICENSE)
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
@@ -18,7 +22,10 @@
 
        ) where
 
+import Data.Data
 import Data.Semigroup
+import Data.Foldable
+import Data.Traversable
 
 infix 5 :||:
 
@@ -38,7 +45,7 @@
 --   the outermost splits and throws away everything in between.
 data Cut m = Uncut m
            | m :||: m
-  deriving (Show)
+  deriving (Data, Typeable, Show, Read, Functor, Foldable, Traversable)
 
 -- | If @m@ is a @Semigroup@, then @Cut m@ is a semigroup which
 --   contains @m@ as a sub-semigroup, but also contains elements of
diff --git a/src/Data/Monoid/Deletable.hs b/src/Data/Monoid/Deletable.hs
--- a/src/Data/Monoid/Deletable.hs
+++ b/src/Data/Monoid/Deletable.hs
@@ -1,10 +1,12 @@
-{-# LANGUAGE DeriveFunctor
-  #-}
-
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable     #-}
+{-# LANGUAGE DeriveFunctor      #-}
+{-# LANGUAGE DeriveTraversable  #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports       #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Monoid.Deletable
--- Copyright   :  (c) 2011 diagrams-core team (see LICENSE)
+-- Copyright   :  (c) 2011-2015 diagrams-core team (see LICENSE)
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
@@ -22,6 +24,9 @@
 
        ) where
 
+import Data.Data
+import Data.Foldable
+import Data.Traversable
 import Data.Semigroup
 
 -- | If @m@ is a 'Monoid', then @Deletable m@ (intuitively speaking)
@@ -52,7 +57,7 @@
 --   * The remaining case is symmetric with the second.
 
 data Deletable m = Deletable Int m Int
-  deriving (Functor, Show)
+  deriving (Data, Typeable, Show, Read, Functor, Foldable, Traversable)
 
 -- | Project the wrapped value out of a `Deletable` value.
 unDelete :: Deletable m -> m
diff --git a/src/Data/Monoid/Endomorphism.hs b/src/Data/Monoid/Endomorphism.hs
--- a/src/Data/Monoid/Endomorphism.hs
+++ b/src/Data/Monoid/Endomorphism.hs
@@ -1,10 +1,10 @@
-{-# LANGUAGE StandaloneDeriving #-}
-{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleContexts     #-}
+{-# LANGUAGE StandaloneDeriving   #-}
 {-# LANGUAGE UndecidableInstances #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Monoid.Endomorphism
--- Copyright   :  (c) 2013 diagrams-core team (see LICENSE)
+-- Copyright   :  (c) 2013-2015 diagrams-core team (see LICENSE)
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
@@ -30,7 +30,7 @@
 --   and the identity morphism as the identity element.
 newtype Endomorphism k a = Endomorphism {getEndomorphism :: k a a}
 
-deriving instance Show (k a a) =>  Show (Endomorphism k a)
+deriving instance Show (k a a) => Show (Endomorphism k a)
 
 instance Semigroupoid k => Semigroup (Endomorphism k a) where
   Endomorphism a <> Endomorphism b = Endomorphism (a `o` b)
diff --git a/src/Data/Monoid/Inf.hs b/src/Data/Monoid/Inf.hs
--- a/src/Data/Monoid/Inf.hs
+++ b/src/Data/Monoid/Inf.hs
@@ -1,16 +1,19 @@
-{-# LANGUAGE DeriveFoldable    #-}
-{-# LANGUAGE DeriveFunctor     #-}
-{-# LANGUAGE DeriveTraversable #-}
-{-# LANGUAGE EmptyDataDecls    #-}
-{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable     #-}
+{-# LANGUAGE DeriveFunctor      #-}
+{-# LANGUAGE DeriveTraversable  #-}
+{-# LANGUAGE EmptyDataDecls     #-}
+{-# LANGUAGE FlexibleInstances  #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports       #-}
+
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Monoid.Inf
--- Copyright   :  (c) 2012 diagrams-core team (see LICENSE)
+-- Copyright   :  (c) 2012-2015 diagrams-core team (see LICENSE)
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
--- Make semigroup under 'min' or 'max' into monoids by adjoining an
+-- Make semigroups under 'min' or 'max' into monoids by adjoining an
 -- element corresponding to infinity (positive or negative,
 -- respectively). These types are similar to @Option (Min a)@ and
 -- @Option (Max a)@ respectively, except that the 'Ord' instance
@@ -28,6 +31,7 @@
        , posFinite, negFinite
        ) where
 
+import           Data.Data
 import           Data.Semigroup
 import           Prelude          hiding (maximum, minimum)
 import qualified Prelude          as P
@@ -39,7 +43,8 @@
 data Neg
 
 data Inf p a = Infinity | Finite a
-  deriving (Eq, Show, Read, Functor, Foldable, Traversable)
+  deriving (Data, Typeable, Show, Read, Eq, Functor, Foldable,
+            Traversable)
 
 type PosInf a = Inf Pos a
 type NegInf a = Inf Neg a
diff --git a/src/Data/Monoid/MList.hs b/src/Data/Monoid/MList.hs
--- a/src/Data/Monoid/MList.hs
+++ b/src/Data/Monoid/MList.hs
@@ -1,12 +1,15 @@
+{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE FlexibleContexts           #-}
 {-# LANGUAGE FlexibleInstances          #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses      #-}
-{-# LANGUAGE OverlappingInstances       #-}
 {-# LANGUAGE TypeFamilies               #-}
 {-# LANGUAGE TypeOperators              #-}
 {-# LANGUAGE TypeSynonymInstances       #-}
 {-# LANGUAGE UndecidableInstances       #-}
+#if __GLASGOW_HASKELL__ < 710
+{-# LANGUAGE OverlappingInstances       #-}
+#endif
 
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 
@@ -91,7 +94,11 @@
   -- | Alter the value of type @a@ by applying the given function to it.
   alt  :: (Option a -> Option a) -> l -> l
 
+#if __GLASGOW_HASKELL__ >= 710
+instance {-# OVERLAPPING #-} MList t => (:>:) (a ::: t) a where
+#else
 instance MList t => (:>:) (a ::: t) a where
+#endif
   inj a = (Option (Just a), empty)
   get   = fst
   alt   = first
diff --git a/src/Data/Monoid/Recommend.hs b/src/Data/Monoid/Recommend.hs
--- a/src/Data/Monoid/Recommend.hs
+++ b/src/Data/Monoid/Recommend.hs
@@ -1,7 +1,12 @@
+{-# LANGUAGE CPP                #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveFoldable     #-}
+{-# LANGUAGE DeriveFunctor      #-}
+{-# LANGUAGE DeriveTraversable  #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Monoid.Recommend
--- Copyright   :  (c) 2012 diagrams-core team (see LICENSE)
+-- Copyright   :  (c) 2012-2015 diagrams-core team (see LICENSE)
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
@@ -14,11 +19,18 @@
 -----------------------------------------------------------------------------
 
 module Data.Monoid.Recommend
-       ( Recommend(..), getRecommend
+       ( Recommend(..)
+       , getRecommend
        ) where
 
-import Data.Semigroup
+#if __GLASGOW_HASKELL__ < 710
+import           Data.Foldable
+import           Data.Traversable
+#endif
 
+import           Data.Data
+import           Data.Semigroup
+
 -- | A value of type @Recommend a@ consists of a value of type @a@
 --   wrapped up in one of two constructors.  The @Recommend@
 --   constructor indicates a \"non-committal recommendation\"---that
@@ -28,7 +40,7 @@
 --   overriding any @Recommend@ed values.
 data Recommend a = Recommend a
                  | Commit a
-                   deriving Show
+  deriving (Show, Read, Functor, Eq, Ord, Typeable, Data, Foldable, Traversable)
 
 -- | Extract the value of type @a@ wrapped in @Recommend a@.
 getRecommend :: Recommend a -> a
diff --git a/src/Data/Monoid/Split.hs b/src/Data/Monoid/Split.hs
--- a/src/Data/Monoid/Split.hs
+++ b/src/Data/Monoid/Split.hs
@@ -1,11 +1,14 @@
-{-# LANGUAGE FlexibleInstances
-           , MultiParamTypeClasses
-  #-}
-
+{-# LANGUAGE DeriveDataTypeable    #-}
+{-# LANGUAGE DeriveFoldable        #-}
+{-# LANGUAGE DeriveFunctor         #-}
+{-# LANGUAGE DeriveTraversable     #-}
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports       #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Data.Monoid.Split
--- Copyright   :  (c) 2011 diagrams-core team (see LICENSE)
+-- Copyright   :  (c) 2011-2015 diagrams-core team (see LICENSE)
 -- License     :  BSD-style (see LICENSE)
 -- Maintainer  :  diagrams-discuss@googlegroups.com
 --
@@ -23,11 +26,16 @@
 -----------------------------------------------------------------------------
 
 module Data.Monoid.Split
-       ( Split(..), split, unsplit
+       ( Split(..)
+       , split
+       , unsplit
 
        ) where
 
+import Data.Data
+import Data.Foldable
 import Data.Semigroup
+import Data.Traversable
 
 import Data.Monoid.Action
 
@@ -48,7 +56,7 @@
 --   keeps the outermost splits and throws away everything in between.
 data Split m = M m
              | m :| m
-  deriving (Show)
+  deriving (Data, Typeable, Show, Read, Eq, Functor, Foldable, Traversable)
 
 -- | If @m@ is a @Semigroup@, then @Split m@ is a semigroup which
 --   combines values on either side of a split, keeping only the
