diff --git a/raw-feldspar.cabal b/raw-feldspar.cabal
--- a/raw-feldspar.cabal
+++ b/raw-feldspar.cabal
@@ -1,5 +1,5 @@
 name:                raw-feldspar
-version:             0.3.1
+version:             0.4
 synopsis:            Resource-Aware Feldspar
 description:         An implementation of the Feldspar EDSL with focus on
                      resource-awareness.
@@ -94,18 +94,18 @@
   build-depends:
     array < 0.6,
     base < 5,
-    constraints < 0.12,
+    constraints < 0.14,
     containers < 0.7,
     data-default-class < 0.2,
     data-hash < 0.3,
-    imperative-edsl >= 0.8 && < 0.9,
-    language-c-quote < 0.13,
+    imperative-edsl >= 0.9 && < 0.10,
+    language-c-quote < 0.14,
     mtl < 2.3,
     operational-alacarte,
     prelude-edsl >= 0.4,
     syntactic >= 3.8,
       -- That version fixes overlap bugs
-    template-haskell < 2.17
+    template-haskell < 2.18
 
   if impl(ghc == 8.0.*)
     build-depends:
diff --git a/src/Feldspar/Data/Vector.hs b/src/Feldspar/Data/Vector.hs
--- a/src/Feldspar/Data/Vector.hs
+++ b/src/Feldspar/Data/Vector.hs
@@ -364,7 +364,7 @@
 
 -- | Take the head of a non-empty vector
 head :: Pully vec a => vec -> a
-head = (!0)
+head = (! 0)
 
 tail :: Pully vec a => vec -> Pull a
 tail = drop 1
diff --git a/src/Feldspar/Representation.hs b/src/Feldspar/Representation.hs
--- a/src/Feldspar/Representation.hs
+++ b/src/Feldspar/Representation.hs
@@ -237,8 +237,6 @@
     evalSym (GuardVal _ msg) = \cond a ->
         if cond then a else error $ "Feldspar assertion failure: " ++ msg
 
-instance EvalEnv ExtraPrimitive env
-
 instance Equality ExtraPrimitive
   where
     equal DivBalanced    DivBalanced    = True
@@ -248,8 +246,6 @@
     hash DivBalanced    = hashInt 1
     hash (GuardVal _ _) = hashInt 2
 
-instance StringTree ExtraPrimitive
-
 -- | For loop
 data ForLoop sig
   where
@@ -261,10 +257,6 @@
     evalSym ForLoop = \len init body ->
         foldl (flip body) init $ genericTake len [0..]
 
-instance EvalEnv ForLoop env
-
-instance StringTree ForLoop
-
 -- | Interaction with the IO layer
 data Unsafe sig
   where
@@ -275,14 +267,10 @@
   where
     renderSym (UnsafePerform _) = "UnsafePerform ..."
 
-instance StringTree Unsafe
-
 instance Eval Unsafe
   where
     evalSym s = error $ "eval: cannot evaluate unsafe operation " ++ renderSym s
 
-instance EvalEnv Unsafe env
-
 -- | 'equal' always returns 'False'
 instance Equality Unsafe
   where
@@ -361,23 +349,14 @@
     => sub sig -> f
 sugarSymFeldPrim = sugarSymDecor $ ValT $ Single primTypeRep
 
--- | Evaluate a closed expression
-eval :: (Syntactic a, Domain a ~ FeldDomain) => a -> Internal a
-eval = evalClosed . desugar
-  -- Note that a `Syntax` constraint would rule out evaluating functions
-
 instance Imp.FreeExp Data
   where
     type FreePred Data = PrimType'
     constExp = sugarSymFeldPrim . Lit
     varExp   = sugarSymFeldPrim . FreeVar
 
-instance Imp.EvalExp Data
-  where
-    evalExp = eval
 
 
-
 --------------------------------------------------------------------------------
 -- * Monadic computations
 --------------------------------------------------------------------------------
@@ -432,3 +411,32 @@
 
 deriveSymbol ''Unsafe
 
+
+
+--------------------------------------------------------------------------------
+-- * Interpretation
+--------------------------------------------------------------------------------
+
+-- The stuff below depends on the TH-generated instances. From GHC 9, it seems
+-- that generated instances are only in scope after the splice. The alternative
+-- to move the splices up into the code is not possible (at least not easily)
+-- because of the mutual dependencies between the different types. (Definitions
+-- that occur after a splice are not in scope before the splice.)
+
+instance EvalEnv ExtraPrimitive env
+instance StringTree ExtraPrimitive
+
+instance EvalEnv ForLoop env
+instance StringTree ForLoop
+
+instance EvalEnv Unsafe env
+instance StringTree Unsafe
+
+-- | Evaluate a closed expression
+eval :: (Syntactic a, Domain a ~ FeldDomain) => a -> Internal a
+eval = evalClosed . desugar
+  -- Note that a `Syntax` constraint would rule out evaluating functions
+
+instance Imp.EvalExp Data
+  where
+    evalExp = eval
diff --git a/src/Feldspar/Run/Frontend.hs b/src/Feldspar/Run/Frontend.hs
--- a/src/Feldspar/Run/Frontend.hs
+++ b/src/Feldspar/Run/Frontend.hs
@@ -33,17 +33,14 @@
 --
 -- This is generally an unsafe operation. E.g. it can be used to make a
 -- reference to a data structure escape the scope of the data.
---
--- The 'IsPointer' class ensures that the operation is only possible for types
--- that are represented as pointers in C.
-unsafeSwap :: IsPointer a => a -> a -> Run ()
+unsafeSwap :: Ptr a -> Ptr a -> Run ()
 unsafeSwap a b = Run $ Imp.unsafeSwap a b
 
 -- | Like 'unsafeSwap' but for arrays. The why we cannot use 'unsafeSwap'
 -- directly is that 'Arr' cannot be made an instance of 'IsPointer'.
 unsafeSwapArr :: Arr a -> Arr a -> Run ()
 unsafeSwapArr arr1 arr2 = Run $ sequence_ $
-    zipListStruct Imp.unsafeSwap (unArr arr1) (unArr arr2)
+    zipListStruct Imp.unsafeSwapArr (unArr arr1) (unArr arr2)
   -- An alternative would be to make a new `IsPointer` class for Feldspar
 
 
@@ -66,7 +63,7 @@
 
 class PrintfType r
   where
-    fprf :: Handle -> String -> [Imp.PrintfArg Data] -> r
+    fprf :: Handle -> String -> [Imp.PrintfArg Data PrimType'] -> r
 
 instance (a ~ ()) => PrintfType (Run a)
   where
