diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,6 +1,19 @@
 # Changelog for [`hoopl` package](http://hackage.haskell.org/package/hoopl)
 
-## 3.10.1.1 *Aug 2015*
+## 3.10.2.1 *Dec 2015*
+  This release includes only non-functional changes.
+
+ - Rewrite Applicative/Monad instances into normal-form
+
+ - Relax the upper bound constraint of base to include 4.9
+
+ - Replace `#if CABAL` macro by no CPP at all
+
+ - Wrap redudant wild card pattens in conditional compilation 
+
+ - Prefix unused type variables with underscores. 
+
+## 3.10.2.0 *Aug 2015*
 
  - Add #if CABAL macro to several hoopl source files such that the Cabal generated macro is not included when building in ghci
 
diff --git a/hoopl.cabal b/hoopl.cabal
--- a/hoopl.cabal
+++ b/hoopl.cabal
@@ -1,5 +1,5 @@
 Name:                hoopl
-Version:             3.10.2.0
+Version:             3.10.2.1
 -- NOTE: Don't forget to update ./changelog.md
 Description:
   Higher-order optimization library
@@ -45,7 +45,7 @@
     Other-Extensions: Safe Trustworthy
 
   Hs-Source-Dirs:    src
-  Build-Depends:     base >= 4.3 && < 4.9, containers >= 0.4 && < 0.6
+  Build-Depends:     base >= 4.3 && < 4.10, containers >= 0.4 && < 0.6
   Exposed-Modules:   Compiler.Hoopl,
                      Compiler.Hoopl.Internals,
                      Compiler.Hoopl.Wrappers,
@@ -78,7 +78,7 @@
   Type:              exitcode-stdio-1.0
   Main-Is:           Main.hs
   Hs-Source-Dirs:    testing src
-  Build-Depends:     base >= 4.3 && < 4.9, 
+  Build-Depends:     base >= 4.3 && < 4.10, 
                      containers >= 0.4 && < 0.6,
                      filepath,
                      mtl >= 2.1.3.1,
diff --git a/src/Compiler/Hoopl/Block.hs b/src/Compiler/Hoopl/Block.hs
--- a/src/Compiler/Hoopl/Block.hs
+++ b/src/Compiler/Hoopl/Block.hs
@@ -58,8 +58,8 @@
 
 -- | Either type indexed by closed/open using type families
 type family IndexedCO ex a b :: *
-type instance IndexedCO C a b = a
-type instance IndexedCO O a b = b
+type instance IndexedCO C a _b = a
+type instance IndexedCO O _a b = b
 
 -- | Maybe type indexed by open/closed
 data MaybeO ex t where
diff --git a/src/Compiler/Hoopl/Dataflow.hs b/src/Compiler/Hoopl/Dataflow.hs
--- a/src/Compiler/Hoopl/Dataflow.hs
+++ b/src/Compiler/Hoopl/Dataflow.hs
@@ -247,7 +247,9 @@
                 -> Fact e f -> m (DG f n e C, Fact C f)
              c NothingC (JustO entry)   = block entry `cat` body (successors entry) bdy
              c (JustC entries) NothingO = body entries bdy
+#if __GLASGOW_HASKELL__ < 711
              c _ _ = error "bogus GADT pattern match failure"
+#endif
 
     -- Lift from nodes to blocks
 -- @ start block.tex -2
@@ -439,7 +441,9 @@
                 -> Fact C f -> m (DG f n e C, Fact e f)
              c NothingC (JustO entry)   = block entry `cat` body (successors entry) bdy
              c (JustC entries) NothingO = body entries bdy
+#if __GLASGOW_HASKELL__ < 711
              c _ _ = error "bogus GADT pattern match failure"
+#endif
 
     -- Lift from nodes to blocks
     block BNil          = \f -> return (dgnil, f)
diff --git a/src/Compiler/Hoopl/Fuel.hs b/src/Compiler/Hoopl/Fuel.hs
--- a/src/Compiler/Hoopl/Fuel.hs
+++ b/src/Compiler/Hoopl/Fuel.hs
@@ -21,14 +21,7 @@
 import Compiler.Hoopl.Checkpoint
 import Compiler.Hoopl.Unique
 
-#if CABAL
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative (Applicative(..))
-#endif
-#else
-import Control.Applicative (Applicative(..))
-#endif
-
+import Control.Applicative as AP (Applicative(..))
 import Control.Monad (ap,liftM)
 
 class Monad m => FuelMonad m where
@@ -64,11 +57,11 @@
   fmap  = liftM
 
 instance Monad m => Applicative (CheckingFuelMonad m) where
-  pure  = return
+  pure a = FM (\f -> return (a, f))
   (<*>) = ap
 
 instance Monad m => Monad (CheckingFuelMonad m) where
-  return a = FM (\f -> return (a, f))
+  return = AP.pure
   fm >>= k = FM (\f -> do { (a, f') <- unFM fm f; unFM (k a) f' })
 
 instance CheckpointMonad m => CheckpointMonad (CheckingFuelMonad m) where
@@ -96,11 +89,11 @@
   fmap  = liftM
 
 instance Monad m => Applicative (InfiniteFuelMonad m) where
-  pure  = return
+  pure a = IFM $ return a
   (<*>) = ap
 
 instance Monad m => Monad (InfiniteFuelMonad m) where
-  return a = IFM $ return a
+  return = pure
   m >>= k  = IFM $ do { a <- unIFM m; unIFM (k a) }
 
 instance UniqueMonad m => UniqueMonad (InfiniteFuelMonad m) where
diff --git a/src/Compiler/Hoopl/Graph.hs b/src/Compiler/Hoopl/Graph.hs
--- a/src/Compiler/Hoopl/Graph.hs
+++ b/src/Compiler/Hoopl/Graph.hs
@@ -46,13 +46,7 @@
 import Compiler.Hoopl.Block
 import Compiler.Hoopl.Label
 
-#if CABAL
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative (Applicative(..))
-#endif
-#else
-import Control.Applicative (Applicative(..))
-#endif
+import Control.Applicative as AP (Applicative(..))
 import Control.Monad (ap,liftM,liftM2)
 
 -- -----------------------------------------------------------------------------
@@ -199,7 +193,9 @@
         sp (GMany e1 b1 NothingO) (GMany NothingO b2 x2)
           = {-# SCC "sp5" #-} (GMany e1 $! b1 `bodyUnion` b2) x2
 
+#if __GLASGOW_HASKELL__ < 711
         sp _ _ = error "bogus GADT match failure"
+#endif
 
 gSplice :: NonLocal n => Graph n e a -> Graph n a x -> Graph n e x
 gSplice = splice blockAppend
@@ -358,11 +354,11 @@
   fmap  = liftM
 
 instance Applicative VM where
-  pure  = return
+  pure a = VM $ \visited -> (a, visited)
   (<*>) = ap
 
 instance Monad VM where
-  return a = VM $ \visited -> (a, visited)
+  return = AP.pure
   m >>= k  = VM $ \visited -> let (a, v') = unVM m visited in unVM (k a) v'
 
 marked :: Label -> VM Bool
diff --git a/src/Compiler/Hoopl/Unique.hs b/src/Compiler/Hoopl/Unique.hs
--- a/src/Compiler/Hoopl/Unique.hs
+++ b/src/Compiler/Hoopl/Unique.hs
@@ -24,14 +24,7 @@
 import qualified Data.IntMap as M
 import qualified Data.IntSet as S
 
-#ifdef CABAL
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
-#else
-import Control.Applicative
-#endif
-
+import Control.Applicative as AP
 import Control.Monad (ap,liftM)
 
 -----------------------------------------------------------------------------
@@ -123,11 +116,11 @@
   fmap = liftM
 
 instance Applicative SimpleUniqueMonad where
-  pure  = return
+  pure a = SUM $ \us -> (a, us)
   (<*>) = ap
 
 instance Monad SimpleUniqueMonad where
-  return a = SUM $ \us -> (a, us)
+  return = AP.pure
   m >>= k  = SUM $ \us -> let (a, us') = unSUM m us in
                               unSUM (k a) us'
 
@@ -152,11 +145,11 @@
   fmap  = liftM
 
 instance Monad m => Applicative (UniqueMonadT m) where
-  pure  = return
+  pure a = UMT $ \us -> return (a, us)
   (<*>) = ap
 
 instance Monad m => Monad (UniqueMonadT m) where
-  return a = UMT $ \us -> return (a, us)
+  return = pure
   m >>= k  = UMT $ \us -> do { (a, us') <- unUMT m us; unUMT (k a) us' }
 
 instance Monad m => UniqueMonad (UniqueMonadT m) where
