diff --git a/csound-expression-dynamic.cabal b/csound-expression-dynamic.cabal
--- a/csound-expression-dynamic.cabal
+++ b/csound-expression-dynamic.cabal
@@ -1,5 +1,5 @@
 Name:          csound-expression-dynamic
-Version:       0.3.4
+Version:       0.3.5
 Cabal-Version: >= 1.10
 License:       BSD3
 License-file:  LICENSE
@@ -24,7 +24,7 @@
 Library
   Ghc-Options:    -Wall
   Build-Depends:
-        base >= 4, base < 5, data-default, containers, array, transformers >= 0.3, wl-pprint >= 1.2.1,
+        base >= 4.6, base < 5, data-default, containers, array, transformers >= 0.3, wl-pprint >= 1.2.1,
         Boolean >= 0.1.0, data-fix >= 0.3.0, data-fix-cse >= 0.0.3, hashable,
         deriving-compat
   Hs-Source-Dirs:      src/
diff --git a/src/Csound/Dynamic/Types/Exp.hs b/src/Csound/Dynamic/Types/Exp.hs
--- a/src/Csound/Dynamic/Types/Exp.hs
+++ b/src/Csound/Dynamic/Types/Exp.hs
@@ -2,6 +2,7 @@
 {-# Language
         DeriveFunctor, DeriveFoldable, DeriveTraversable,
         DeriveGeneric,
+        StandaloneDeriving,
         TypeSynonymInstances, FlexibleInstances,
         TemplateHaskell,
         CPP #-}
@@ -24,7 +25,7 @@
 import Control.Applicative
 #endif
 
-import GHC.Generics (Generic)
+import GHC.Generics (Generic, Generic1)
 import Data.Traversable
 import Data.Foldable hiding (concat)
 
@@ -33,9 +34,11 @@
 import Data.Map(Map)
 import Data.Maybe(isNothing)
 import qualified Data.IntMap as IM
+import qualified Data.IntMap.Internal as IM
 import Data.Fix
 import Data.Eq.Deriving
 import Data.Ord.Deriving
+import Data.Hashable.Lifted
 
 import qualified Csound.Dynamic.Tfm.DeduceTypes as R(Var(..))
 
@@ -74,7 +77,7 @@
         -- value contains the privious statement)
     , ratedExpExp       :: Exp a
         -- ^ Main expression
-    } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
+    } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic, Generic1)
 
 -- | RatedVar is for pretty printing of the wiring ports.
 type RatedVar = R.Var Rate
@@ -108,7 +111,7 @@
 -- | It's a primitive value or something else. It's used for inlining
 -- of the constants (primitive values).
 newtype PrimOr a = PrimOr { unPrimOr :: Either Prim a }
-    deriving (Show, Eq, Ord, Functor, Generic)
+    deriving (Show, Eq, Ord, Functor, Generic, Generic1)
 
 -- | Constructs PrimOr values from the expressions. It does inlining in
 -- case of primitive values.
@@ -187,7 +190,7 @@
     | ReadMacrosInt String
     | ReadMacrosDouble String
     | ReadMacrosString String
-    deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
+    deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic, Generic1)
 
 type IsArrInit = Bool
 type ArrSize a = [a]
@@ -302,7 +305,7 @@
 data Inline a b = Inline
     { inlineExp :: InlineExp a
     , inlineEnv :: IM.IntMap b
-    } deriving (Show, Eq, Ord, Functor, Foldable, Traversable)
+    } deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic1)
 
 instance (Hashable a, Hashable b) => Hashable (Inline a b) where
     hashWithSalt s (Inline a m) = s `hashWithSalt` (hash a) `hashWithSalt` (hash $ IM.toList m)
@@ -315,7 +318,7 @@
 
 -- Expression as a tree (to be inlined)
 data PreInline a b = PreInline a [b]
-    deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)
+    deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic, Generic1)
 
 -- booleans
 
@@ -386,6 +389,14 @@
 instance Hashable a => Hashable (PrimOr a)
 instance Hashable a => Hashable (RatedExp a)
 instance Hashable InstrId
+
+deriving instance Generic1 IM.IntMap
+instance Hashable1 IM.IntMap
+instance Hashable a => Hashable1 (PreInline a)
+instance Hashable a => Hashable1 (Inline a)
+instance Hashable1 RatedExp
+instance Hashable1 MainExp
+instance Hashable1 PrimOr
 
 $(deriveEq1 ''PrimOr)
 $(deriveEq1 ''PreInline)
