diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -20,10 +20,10 @@
 
 ~~~~
 simpleExample :: IO ()
-simpleExample = evalMultiStateT          -- start with an empty state,
+simpleExample = runMultiStateTNil_       -- start with an empty state,
                                          --   i.e. :: MultiStateT '[] IO
-              $ withMultiState 'H'       -- "adding" a char to the state
-              $ withMultiState "ello, World!" -- and a string
+              $ withMultiStateA 'H'      -- "adding" a char to the state
+              $ withMultiStateA "ello, World!" -- and a string
               $ do                       -- so:
   -- the monad here is MultiStateT '[String, Char] IO
   let combinedPrint = do       -- no type signature necessary
@@ -101,16 +101,18 @@
             /-------------------------------------------------------\
             |     withState                withState .. withState   v
 StateT '[s, ..] m --------> StateT '[..] m --------> .. --------> StateT '[] m
+            |     <--------                                         |
+            |   (withoutState)                                      |
             |                                                       |
             |                                                       |
             |   runStateT                            runStateTNil   |
             \--------------------> m .. <---------------------------/
 ~~~~
 
-Specific functions are
+Specific functions are (constraints omitted):
 
 ~~~~
-runMultiStateT = runStateTAS
+runMultiStateT = runMultiStateTAS
 runMultiStateTA  :: HList s -> MultiStateT s m a -> m a
 runMultiStateTAS :: HList s -> MultiStateT s m a -> m (a, s)
 runMultiStateTSA :: HList s -> MultiStateT s m a -> m (s, a)
@@ -120,19 +122,21 @@
 runMultiStateTNil  :: MultiStateT '[] m a -> m a
 runMultiStateTNil_ :: MultiStateT '[] m a -> m ()
 
-withMultiState = withStateAS
+withMultiState = withMultiStateAS
 withMultiStateA  :: s -> MultiStateT (s ': ss) m a -> MultiStateT ss m a
 withMultiStateAS :: s -> MultiStateT (s ': ss) m a -> MultiStateT ss m (a, s)
 withMultiStateSA :: s -> MultiStateT (s ': ss) m a -> MultiStateT ss m (s, a)
 withMultiStateS  :: s -> MultiStateT (s ': ss) m a -> MultiStateT ss m s
 withMultiState_  :: s -> MultiStateT (s ': ss) m a -> MultiStateT ss m ()
 
-withMultiStates = withStatesAS
+withMultiStates = withMultiStatesAS
 withMultiStatesAS :: HList s1 -> MultiStateT (Append s1 s2) m a -> MultiStateT s2 m (a, HList s1)
 withMultiStatesSA :: HList s1 -> MultiStateT (Append s1 s2) m a -> MultiStateT s2 m (HList s1, a)
 withMultiStatesA  :: HList s1 -> MultiStateT (Append s1 s2) m a -> MultiStateT s2 m a
 withMultiStatesS  :: HList s1 -> MultiStateT (Append s1 s2) m a -> MultiStateT s2 m (HList s1)
 withMultiStates_  :: HList s1 -> MultiStateT (Append s1 s2) m a -> MultiStateT s2 m ()
+
+withoutMultiState :: MultiStateT ss m a -> MultiStateT (s ': ss) m a
 ~~~~
 
 ## Known Deficits
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,13 @@
 # Changelog for [`multistate` package](https://hackage.haskell.org/package/multistate)
 
+## 0.7.1.1 *May 2016*
+
+  * Adapt for ghc-8
+
+## 0.7.1.0 *March 2016*
+
+  * Add new method `withoutMultiFoo`, inverse of `withMultiFoo`
+
 ## 0.7.0.0 *February 2016*
 
   * Add instances:
@@ -60,7 +68,7 @@
 
   * Deprecate previous modules
 
-## 0.3.0.0 *Januar 2015*
+## 0.3.0.0 *January 2015*
 
   * Add `MultiWriter`
 
@@ -68,7 +76,7 @@
 
   * support ghc-7.10
 
-## 0.2.0.0 *Januar 2015*
+## 0.2.0.0 *January 2015*
 
   * Start using DataKinds and TypeOperators to make the HList
     representation more readable. The translation roughly is:
diff --git a/multistate.cabal b/multistate.cabal
--- a/multistate.cabal
+++ b/multistate.cabal
@@ -1,5 +1,5 @@
 Name:          multistate
-Version:       0.7.0.0
+Version:       0.7.1.1
 Cabal-Version: >= 1.10
 Build-Type:    Simple
 license:       BSD3
@@ -11,7 +11,7 @@
 Bug-reports:   https://github.com/lspitzner/multistate/issues
 Stability:     Experimental
 category:      Control
-tested-with:   GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.1
+tested-with:   GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1
 
 Synopsis: like mtl's ReaderT / WriterT / StateT, but more than one
           contained value/type.
@@ -26,9 +26,6 @@
   .
   See the <https://github.com/lspitzner/multistate README> for
   a longer description.
-  .
-  The latest published version contains some breaking changes.
-  Please complain if this causes problems (for future consideration).
 
 extra-source-files:
     README.md
@@ -68,26 +65,34 @@
     Control.Monad.Trans.MultiRWS.Strict
   other-modules:
   build-depends:
-    base         >= 4.6   && <4.9,
+    base         >= 4.6   && <4.10,
     mtl          >= 2.1   && <2.3,
-    transformers >= 0.3   && <0.5,
+    transformers >= 0.3   && <0.6,
     tagged       >= 0.7   && <0.9,
     transformers-base <0.5,
-    monad-control     <1.1
+    monad-control >= 1.0  && <1.1
   default-extensions:
     GADTs
     TypeFamilies
     MultiParamTypeClasses
     FunctionalDependencies
     FlexibleInstances
-    OverlappingInstances
     UndecidableInstances
     TypeOperators
     DataKinds
+  if impl(ghc < 7.10) {
+    default-extensions:
+      OverlappingInstances
+  }
   ghc-options: {
     -Wall
     -fno-warn-unused-imports
   }
+  if impl(ghc > 8.0) {
+    ghc-options: {
+      -fno-warn-redundant-constraints
+    }
+  }
   hs-source-dirs: src
 }
 
@@ -99,8 +104,8 @@
     -- no version constraints necessary, because they are already
     -- given by library
     multistate,
-    base <4.9,
-    transformers <0.5,
+    base <4.10,
+    transformers <0.6,
     hspec <2.3
   ghc-options:      -Wall
   main-is:          Test.hs
@@ -116,9 +121,9 @@
       -- no version constraints necessary, because they are already
       -- given by library
       multistate,
-      base <4.9,
+      base <4.10,
       mtl <2.3,
-      transformers <0.5
+      transformers <0.6
   } else {
     buildable: False
   }
diff --git a/src/Control/Monad/Trans/MultiRWS.hs b/src/Control/Monad/Trans/MultiRWS.hs
--- a/src/Control/Monad/Trans/MultiRWS.hs
+++ b/src/Control/Monad/Trans/MultiRWS.hs
@@ -42,6 +42,9 @@
   , withMultiStatesA
   , withMultiStatesS
   , withMultiStates_
+  -- * without-functions (reducing an RWST; inverse of with)
+  , withoutMultiReader
+  , withoutMultiState
   -- * inflate-functions (run simple transformer in MultiRWST)
   , inflateReader
   , inflateMultiReader
diff --git a/src/Control/Monad/Trans/MultiRWS/Lazy.hs b/src/Control/Monad/Trans/MultiRWS/Lazy.hs
--- a/src/Control/Monad/Trans/MultiRWS/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiRWS/Lazy.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -46,6 +47,9 @@
   , withMultiStatesA
   , withMultiStatesS
   , withMultiStates_
+  -- * without-functions (reducing an RWST; inverse of with)
+  , withoutMultiReader
+  , withoutMultiState
   -- * inflate-functions (run simple transformer in MultiRWST)
   , inflateReader
   , inflateMultiReader
@@ -136,17 +140,29 @@
 instance MonadTrans (MultiRWST r w s) where
   lift = MultiRWST . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a r)
+#else
 instance (Monad m, ContainsType a r)
+#endif
       => MonadMultiReader a (MultiRWST r w s m) where
   mAsk = MultiRWST $ liftM (\(r,_,_) -> getHListElem r) get
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a w, Monoid a)
+#else
 instance (Monad m, ContainsType a w, Monoid a)
+#endif
       => MonadMultiWriter a (MultiRWST r w s m) where
   mTell v = MultiRWST $ do
     ~(r,w,s) <- get
     put $ (r, setHListElem (getHListElem w `mappend` v) w, s)
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a s)
+#else
 instance (Monad m, ContainsType a s)
+#endif
       => MonadMultiState a (MultiRWST r w s m) where
   mSet v = MultiRWST $ do
     ~(r,w,s) <- get
@@ -360,6 +376,20 @@
   return (x' :+: xs')
 withMultiStates_ HNil       = void
 withMultiStates_ (x :+: xs) = withMultiStates_ xs . withMultiState_ x
+
+withoutMultiReader :: Monad m => MultiRWST rs w s m a -> MultiRWST (r ': rs) w s m a
+withoutMultiReader k = MultiRWST $ do
+  (rs@(_ :+: rr), w, s) <- get
+  ~(a, ~(_, w', s')) <- lift $ runStateT (runMultiRWSTRaw k) (rr, w, s)
+  put (rs, w', s')
+  return a
+
+withoutMultiState :: Monad m => MultiRWST r w ss m a -> MultiRWST r w (s ': ss) m a
+withoutMultiState k = MultiRWST $ do
+  (r, w, s :+: sr) <- get
+  ~(a, ~(_, w', s')) <- lift $ runStateT (runMultiRWSTRaw k) (r, w, sr)
+  put (r, w', s :+: s')
+  return a
 
 inflateReader :: (Monad m, ContainsType r rs)
               => ReaderT r m a
diff --git a/src/Control/Monad/Trans/MultiRWS/Strict.hs b/src/Control/Monad/Trans/MultiRWS/Strict.hs
--- a/src/Control/Monad/Trans/MultiRWS/Strict.hs
+++ b/src/Control/Monad/Trans/MultiRWS/Strict.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -46,6 +47,9 @@
   , withMultiStatesA
   , withMultiStatesS
   , withMultiStates_
+  -- * without-functions (reducing an RWST; inverse of with)
+  , withoutMultiReader
+  , withoutMultiState
   -- * inflate-functions (run simple transformer in MultiRWST)
   , inflateReader
   , inflateMultiReader
@@ -136,17 +140,29 @@
 instance MonadTrans (MultiRWST r w s) where
   lift = MultiRWST . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a r)
+#else
 instance (Monad m, ContainsType a r)
+#endif
       => MonadMultiReader a (MultiRWST r w s m) where
   mAsk = MultiRWST $ liftM (\(r,_,_) -> getHListElem r) get
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a w, Monoid a)
+#else
 instance (Monad m, ContainsType a w, Monoid a)
+#endif
       => MonadMultiWriter a (MultiRWST r w s m) where
   mTell v = MultiRWST $ do
     (r,w,s) <- get
     put $ (r, setHListElem (getHListElem w `mappend` v) w, s)
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a s)
+#else
 instance (Monad m, ContainsType a s)
+#endif
       => MonadMultiState a (MultiRWST r w s m) where
   mSet v = MultiRWST $ do
     (r,w,s) <- get
@@ -360,6 +376,20 @@
   return (x' :+: xs')
 withMultiStates_ HNil       = void
 withMultiStates_ (x :+: xs) = withMultiStates_ xs . withMultiState_ x
+
+withoutMultiReader :: Monad m => MultiRWST rs w s m a -> MultiRWST (r ': rs) w s m a
+withoutMultiReader k = MultiRWST $ do
+  (rs@(_ :+: rr), w, s) <- get
+  (a, (_, w', s')) <- lift $ runStateT (runMultiRWSTRaw k) (rr, w, s)
+  put (rs, w', s')
+  return a
+
+withoutMultiState :: Monad m => MultiRWST r w ss m a -> MultiRWST r w (s ': ss) m a
+withoutMultiState k = MultiRWST $ do
+  (r, w, s :+: sr) <- get
+  (a, (_, w', s')) <- lift $ runStateT (runMultiRWSTRaw k) (r, w, sr)
+  put (r, w', s :+: s')
+  return a
 
 inflateReader :: (Monad m, ContainsType r rs)
               => ReaderT r m a
diff --git a/src/Control/Monad/Trans/MultiReader.hs b/src/Control/Monad/Trans/MultiReader.hs
--- a/src/Control/Monad/Trans/MultiReader.hs
+++ b/src/Control/Monad/Trans/MultiReader.hs
@@ -12,12 +12,14 @@
   , runMultiReaderT_
   , runMultiReaderTNil
   , runMultiReaderTNil_
-  -- * with-functions (single Reader)
+  -- * with-functions (single reader)
   , withMultiReader
   , withMultiReader_
-  -- * with-functions (multiple Readers)
+  -- * with-functions (multiple readers)
   , withMultiReaders
   , withMultiReaders_
+  -- * without-function (single reader)
+  , withoutMultiReader
   -- * inflate-function (run ReaderT in MultiReaderT)
   , inflateReader
   -- * other functions
diff --git a/src/Control/Monad/Trans/MultiReader/Lazy.hs b/src/Control/Monad/Trans/MultiReader/Lazy.hs
--- a/src/Control/Monad/Trans/MultiReader/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiReader/Lazy.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+
 -- | The multi-valued version of mtl's Reader / ReaderT
 module Control.Monad.Trans.MultiReader.Lazy
   (
@@ -12,12 +14,14 @@
   , runMultiReaderT_
   , runMultiReaderTNil
   , runMultiReaderTNil_
-  -- * with-functions (single Reader)
+  -- * with-functions (single reader)
   , withMultiReader
   , withMultiReader_
-  -- * with-functions (multiple Readers)
+  -- * with-functions (multiple readers)
   , withMultiReaders
   , withMultiReaders_
+  -- * without-function (single reader)
+  , withoutMultiReader
   -- * inflate-function (run ReaderT in MultiReaderT)
   , inflateReader
   -- * other functions
@@ -115,7 +119,11 @@
 instance MonadTrans (MultiReaderT x) where
   lift = MultiReaderT . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a c)
+#else
 instance (Monad m, ContainsType a c)
+#endif
       => MonadMultiReader a (MultiReaderT c m) where
   mAsk = MultiReaderT $ liftM getHListElem get
 
@@ -166,6 +174,11 @@
 withMultiReaders  (x :+: xs) = withMultiReaders xs . withMultiReader x
 withMultiReaders_ HNil       = liftM (const ())
 withMultiReaders_ (x :+: xs) = withMultiReaders_ xs . withMultiReader_ x
+
+withoutMultiReader :: Monad m => MultiReaderT rs m a -> MultiReaderT (r ': rs) m a
+withoutMultiReader k = MultiReaderT $ do
+  _ :+: rr <- get
+  lift $ runMultiReaderT rr k
 
 inflateReader :: (Monad m, ContainsType r rs)
               => ReaderT r m a
diff --git a/src/Control/Monad/Trans/MultiReader/Strict.hs b/src/Control/Monad/Trans/MultiReader/Strict.hs
--- a/src/Control/Monad/Trans/MultiReader/Strict.hs
+++ b/src/Control/Monad/Trans/MultiReader/Strict.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+
 -- | The multi-valued version of mtl's Reader / ReaderT
 module Control.Monad.Trans.MultiReader.Strict
   (
@@ -12,12 +14,14 @@
   , runMultiReaderT_
   , runMultiReaderTNil
   , runMultiReaderTNil_
-  -- * with-functions (single Reader)
+  -- * with-functions (single reader)
   , withMultiReader
   , withMultiReader_
-  -- * with-functions (multiple Readers)
+  -- * with-functions (multiple readers)
   , withMultiReaders
   , withMultiReaders_
+  -- * without-function (single reader)
+  , withoutMultiReader
   -- * inflate-function (run ReaderT in MultiReaderT)
   , inflateReader
   -- * other functions
@@ -115,7 +119,11 @@
 instance MonadTrans (MultiReaderT x) where
   lift = MultiReaderT . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a c)
+#else
 instance (Monad m, ContainsType a c)
+#endif
       => MonadMultiReader a (MultiReaderT c m) where
   mAsk = MultiReaderT $ liftM getHListElem get
 
@@ -166,6 +174,11 @@
 withMultiReaders  (x :+: xs) = withMultiReaders xs . withMultiReader x
 withMultiReaders_ HNil       = liftM (const ())
 withMultiReaders_ (x :+: xs) = withMultiReaders_ xs . withMultiReader_ x
+
+withoutMultiReader :: Monad m => MultiReaderT rs m a -> MultiReaderT (r ': rs) m a
+withoutMultiReader k = MultiReaderT $ do
+  _ :+: rr <- get
+  lift $ runMultiReaderT rr k
 
 inflateReader :: (Monad m, ContainsType r rs)
               => ReaderT r m a
diff --git a/src/Control/Monad/Trans/MultiState.hs b/src/Control/Monad/Trans/MultiState.hs
--- a/src/Control/Monad/Trans/MultiState.hs
+++ b/src/Control/Monad/Trans/MultiState.hs
@@ -31,6 +31,8 @@
   , withMultiStatesA
   , withMultiStatesS
   , withMultiStates_
+  -- * without-function (single state)
+  , withoutMultiState
   -- * inflate-functions (run single state in multiple states)
   , inflateState
   , inflateReader
diff --git a/src/Control/Monad/Trans/MultiState/Lazy.hs b/src/Control/Monad/Trans/MultiState/Lazy.hs
--- a/src/Control/Monad/Trans/MultiState/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiState/Lazy.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+
 -- | The multi-valued version of mtl's State / StateT
 module Control.Monad.Trans.MultiState.Lazy
   (
@@ -30,6 +32,8 @@
   , withMultiStatesA
   , withMultiStatesS
   , withMultiStates_
+  -- * without-function (single state)
+  , withoutMultiState
   -- * inflate-functions (run single state in multiple states)
   , inflateState
   , inflateReader
@@ -133,7 +137,11 @@
 instance MonadTrans (MultiStateT x) where
   lift = MultiStateT . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a c)
+#else
 instance (Monad m, ContainsType a c)
+#endif
       => MonadMultiState a (MultiStateT c m) where
   mSet v = MultiStateT $ get >>= put . setHListElem v
   mGet = MultiStateT $ liftM getHListElem get
@@ -221,6 +229,13 @@
                         . withMultiStateS x
 withMultiStates_  HNil       = liftM (const ())
 withMultiStates_ (x :+: xs)  = withMultiStates_ xs . withMultiState_ x
+
+withoutMultiState :: (Functor m, Monad m) => MultiStateT ss m a -> MultiStateT (s ': ss) m a
+withoutMultiState k = MultiStateT $ do
+  s :+: sr <- get
+  ~(a, sr') <- lift $ runMultiStateT sr k
+  put (s :+: sr')
+  return a
 
 inflateState :: (Monad m, ContainsType s ss)
              => StateT s m a
diff --git a/src/Control/Monad/Trans/MultiState/Strict.hs b/src/Control/Monad/Trans/MultiState/Strict.hs
--- a/src/Control/Monad/Trans/MultiState/Strict.hs
+++ b/src/Control/Monad/Trans/MultiState/Strict.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+
 -- | The multi-valued version of mtl's State / StateT
 module Control.Monad.Trans.MultiState.Strict
   (
@@ -30,6 +32,8 @@
   , withMultiStatesA
   , withMultiStatesS
   , withMultiStates_
+  -- * without-function (single state)
+  , withoutMultiState
   -- * inflate-functions (run single state in multiple states)
   , inflateState
   , inflateReader
@@ -131,7 +135,11 @@
 instance MonadTrans (MultiStateT x) where
   lift = MultiStateT . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a c)
+#else
 instance (Monad m, ContainsType a c)
+#endif
       => MonadMultiState a (MultiStateT c m) where
   mSet v = MultiStateT $ get >>= put . setHListElem v
   mGet = MultiStateT $ liftM getHListElem get
@@ -189,7 +197,7 @@
 withMultiState = withMultiStateAS
 withMultiStateAS x k = MultiStateT $ do
   s <- get
-  ~(a, s') <- lift $ runStateT (runMultiStateTRaw k) (x :+: s)
+  (a, s') <- lift $ runStateT (runMultiStateTRaw k) (x :+: s)
   case s' of x' :+: sr' -> do put sr'; return (a, x')
 withMultiStateSA s k = (\(a,b) -> (b,a)) `liftM` withMultiStateAS s k
 withMultiStateA  s k = fst `liftM` withMultiStateAS s k
@@ -219,6 +227,13 @@
                         . withMultiStateS x
 withMultiStates_  HNil       = liftM (const ())
 withMultiStates_ (x :+: xs)  = withMultiStates_ xs . withMultiState_ x
+
+withoutMultiState :: (Functor m, Monad m) => MultiStateT ss m a -> MultiStateT (s ': ss) m a
+withoutMultiState k = MultiStateT $ do
+  s :+: sr <- get
+  (a, sr') <- lift $ runMultiStateT sr k
+  put (s :+: sr')
+  return a
 
 inflateState :: (Monad m, ContainsType s ss)
              => StateT s m a
diff --git a/src/Control/Monad/Trans/MultiWriter/Lazy.hs b/src/Control/Monad/Trans/MultiWriter/Lazy.hs
--- a/src/Control/Monad/Trans/MultiWriter/Lazy.hs
+++ b/src/Control/Monad/Trans/MultiWriter/Lazy.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -125,7 +126,11 @@
 instance MonadTrans (MultiWriterT x) where
   lift = MultiWriterT . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a c, Monoid a)
+#else
 instance (Monad m, ContainsType a c, Monoid a)
+#endif
       => MonadMultiWriter a (MultiWriterT c m) where
   mTell v = MultiWriterT $ do
     x <- get
diff --git a/src/Control/Monad/Trans/MultiWriter/Strict.hs b/src/Control/Monad/Trans/MultiWriter/Strict.hs
--- a/src/Control/Monad/Trans/MultiWriter/Strict.hs
+++ b/src/Control/Monad/Trans/MultiWriter/Strict.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE ScopedTypeVariables #-}
@@ -125,7 +126,11 @@
 instance MonadTrans (MultiWriterT x) where
   lift = MultiWriterT . lift
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} (Monad m, ContainsType a c, Monoid a)
+#else
 instance (Monad m, ContainsType a c, Monoid a)
+#endif
       => MonadMultiWriter a (MultiWriterT c m) where
   mTell v = MultiWriterT $ do
     x <- get
diff --git a/src/Data/HList/ContainsType.hs b/src/Data/HList/ContainsType.hs
--- a/src/Data/HList/ContainsType.hs
+++ b/src/Data/HList/ContainsType.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+
 -- | Class to provide type-driven access to elements of a HList
 module Data.HList.ContainsType
   ( ContainsType(..)
@@ -14,7 +16,11 @@
   setHListElem :: a -> HList c -> HList c
   getHListElem :: HList c -> a
 
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} ContainsType a (a ': xs) where
+#else
 instance ContainsType a (a ': xs) where
+#endif
   setHListElem a xs = a :+: case xs of (_ :+: xr) -> xr
   getHListElem (x :+: _) = x
 
diff --git a/src/Data/HList/HList.hs b/src/Data/HList/HList.hs
--- a/src/Data/HList/HList.hs
+++ b/src/Data/HList/HList.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE DataKinds #-}
@@ -62,6 +63,9 @@
     x1 :+: xr1 == x2 :+: xr2 = x1==x2 && xr1==xr2
     x1 :+: xr1 /= x2 :+: xr2 = x1/=x2 || xr1/=xr2
 
+-- cannot use the closed variant because of ghc-7.8.4.
+-- (was not investigated more closely; there simply
+--  is some syntax error for code which works fine with ghc-7.10.)
 type family Append (l1::[*]) (l2::[*]) :: [*]
 type instance Append '[] l2 = l2
 type instance Append (car1 ': cdr2) l2 = car1 ': Append cdr2 l2
@@ -79,7 +83,11 @@
   hSplit l = (HNil, l)
 instance HInit l1 => HInit (x ': l1) where
   hInit p (x :+: xs)  = x :+: hInit p xs
+#if !MIN_VERSION_base(4,9,0)
   hInit _ _           = error "cannot happen" -- see ghc trac #3927
+#endif
   hSplit (x :+: xs) = let (l1, l2) = hSplit xs
                        in (x :+: l1, l2)
+#if !MIN_VERSION_base(4,9,0)
   hSplit _          = error "cannot happen"
+#endif
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -1,7 +1,9 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE TypeOperators #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE GADTs #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
 
 module Main where
 
@@ -196,6 +198,9 @@
     l :: (Int, Bool)
     l = case runIdentity $ MS.runMultiStateTS ([] :+: [] :+: HNil) action of
       (x :+: y :+: _) -> (head x, head y)
+#if !MIN_VERSION_base(4,9,0)
+      _ -> error "some ghc versions think that above is not exhaustive."
+#endif
     action :: MS.MultiStateT '[[Int], [Bool]] Identity ()
     action = do
       action
