diff --git a/registry.cabal b/registry.cabal
--- a/registry.cabal
+++ b/registry.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.31.1.
+-- This file has been generated from package.yaml by hpack version 0.31.2.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: fcba2812a0ecc52110acade5e9fed0482c1c6ea5b50047c57cb08713dc4c9a42
+-- hash: 4b8f95b17c048f77ecc40758d76c80db69f8e112fbc915ca1e9dc61da09a464d
 
 name:           registry
-version:        0.1.7.0
+version:        0.1.7.1
 synopsis:       data structure for assembling components
 description:    This library provides a "Registry" which is a data structure containing a list of functions and values representing dependencies in a directed acyclic graph. A `make` function can then be used to create a value of a specific type out of the registry.
                 You can start with the [README](https://github.com/etorreborre/registry/blob/master/README.md) for a full description of the library.
@@ -53,7 +53,7 @@
       base >=4.7 && <5
     , containers >=0.5 && <0.7
     , exceptions >=0.8 && <0.11
-    , hashable >=1.2 && <1.3
+    , hashable >=1.2 && <1.4
     , mmorph >=1.0 && <2
     , mtl >=2.0 && <3
     , protolude >=0.2 && <0.3
@@ -115,7 +115,7 @@
     , directory <1.4
     , exceptions >=0.8 && <0.11
     , generic-lens <2
-    , hashable >=1.2 && <1.3
+    , hashable >=1.2 && <1.4
     , hedgehog >=1.0 && <2.0
     , io-memoize <1.2
     , mmorph >=1.0 && <2
@@ -126,7 +126,7 @@
     , registry
     , resourcet >=1.1 && <1.3
     , semigroupoids >=5.0 && <5.4
-    , semigroups <0.19
+    , semigroups <0.20
     , tasty <1.3
     , tasty-discover <4.3
     , tasty-hedgehog >=1.0 && <1.1
diff --git a/src/Data/Registry/Internal/Cache.hs b/src/Data/Registry/Internal/Cache.hs
--- a/src/Data/Registry/Internal/Cache.hs
+++ b/src/Data/Registry/Internal/Cache.hs
@@ -10,7 +10,6 @@
 
 import           Data.Map.Strict
 import           Data.Registry.Internal.Types (SpecializationPath)
-import           Data.Typeable                (Typeable)
 import           Protolude                    as P
 
 -- | A thread-safe write-once cache. If you need more functionality,
diff --git a/src/Data/Registry/Internal/Make.hs b/src/Data/Registry/Internal/Make.hs
--- a/src/Data/Registry/Internal/Make.hs
+++ b/src/Data/Registry/Internal/Make.hs
@@ -21,7 +21,6 @@
 import           Data.Registry.Internal.Registry
 import           Data.Registry.Internal.Stack
 import           Data.Registry.Internal.Types
-import           Data.Text                         as T (unlines)
 import qualified Data.Text                         as T
 import           Protolude                         as P hiding (Constructor)
 import           Type.Reflection
diff --git a/src/Data/Registry/Internal/Reflection.hs b/src/Data/Registry/Internal/Reflection.hs
--- a/src/Data/Registry/Internal/Reflection.hs
+++ b/src/Data/Registry/Internal/Reflection.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE KindSignatures      #-}
 {-# LANGUAGE PolyKinds           #-}
 {-# LANGUAGE TypeInType          #-}
 
@@ -10,7 +9,7 @@
 
 import           Data.Semigroup
 import           Data.Text as T
-import           Data.Typeable (tyConModule, tyConName, splitTyConApp)
+import           Data.Typeable (splitTyConApp)
 import           Protolude       as P hiding (intercalate, TypeRep, isPrefixOf, (<>))
 import           Type.Reflection
 import           GHC.Exts
diff --git a/src/Data/Registry/Lift.hs b/src/Data/Registry/Lift.hs
--- a/src/Data/Registry/Lift.hs
+++ b/src/Data/Registry/Lift.hs
@@ -78,15 +78,15 @@
 --   It uses an auxiliary typeclass to count the arguments of a function
 data Nat = Z | S Nat
 
-data NumArgs :: Nat -> * -> * where
+data NumArgs :: Nat -> Type -> Type where
   NAZ :: NumArgs Z a
   NAS :: NumArgs n b -> NumArgs (S n) (a -> b)
 
-type family CountArgs (f :: *) :: Nat where
+type family CountArgs (f :: Type) :: Nat where
   CountArgs (a -> b) = S (CountArgs b)
   CountArgs result = Z
 
-class CNumArgs (numArgs :: Nat) (arrows :: *) where
+class CNumArgs (numArgs :: Nat) (arrows :: Type) where
   getNA :: NumArgs numArgs arrows
 
 instance CNumArgs Z a where
@@ -95,7 +95,7 @@
 instance CNumArgs n b => CNumArgs (S n) (a -> b) where
   getNA = NAS getNA
 
-type family Apply (f :: * -> *) (n :: Nat) (arrows :: *) :: * where
+type family Apply (f :: Type -> Type) (n :: Nat) (arrows :: Type) :: Type where
   Apply f (S n) (a -> b) = a -> Apply f n b
   Apply f Z a = f a
 
diff --git a/src/Data/Registry/Make.hs b/src/Data/Registry/Make.hs
--- a/src/Data/Registry/Make.hs
+++ b/src/Data/Registry/Make.hs
@@ -34,7 +34,6 @@
 import           Data.Registry.Internal.Types
 import           Data.Registry.Registry
 import           Data.Registry.Solver
-import           Data.Typeable                   (Typeable)
 import qualified Prelude                         (error)
 import           Protolude                       as P hiding (Constructor)
 import           Type.Reflection
diff --git a/src/Data/Registry/Registry.hs b/src/Data/Registry/Registry.hs
--- a/src/Data/Registry/Registry.hs
+++ b/src/Data/Registry/Registry.hs
@@ -45,8 +45,6 @@
 import           Data.Registry.Solver
 import           Data.Dynamic
 import           Data.Semigroup             ((<>))
-import           Data.Text                  as T (unlines)
-import           Data.Typeable              (Typeable)
 import qualified Prelude                    (show)
 import           Protolude                  as P hiding ((<>))
 import           Type.Reflection
@@ -54,7 +52,7 @@
 -- | Container for a list of functions or values
 --   Internally all functions and values are stored as 'Dynamic' values
 --   so that we can access their representation
-data Registry (inputs :: [*]) (outputs :: [*]) =
+data Registry (inputs :: [Type]) (outputs :: [Type]) =
   Registry {
     _values          :: Values
   , _functions       :: Functions
@@ -271,7 +269,7 @@
   modifiers
 
 -- | Typeclass for extracting type representations out of a list of types
-class PathToTypeReps (path :: [*]) where
+class PathToTypeReps (path :: [Type]) where
   someTypeReps :: Proxy path -> NonEmpty SomeTypeRep
 
 instance {-# OVERLAPPING #-} (Typeable a) => PathToTypeReps '[a] where
@@ -329,7 +327,7 @@
 memoizeAll r = _unMemoizeRegistry <$>
   memoizeActions (startMemoizeRegistry r)
 
-newtype MemoizeRegistry (todo :: [*]) (ins :: [*]) (out :: [*]) = MemoizeRegistry { _unMemoizeRegistry :: Registry ins out }
+newtype MemoizeRegistry (todo :: [Type]) (ins :: [Type]) (out :: [Type]) = MemoizeRegistry { _unMemoizeRegistry :: Registry ins out }
 
 startMemoizeRegistry :: Registry ins out -> MemoizeRegistry out ins out
 startMemoizeRegistry = MemoizeRegistry
diff --git a/src/Data/Registry/Solver.hs b/src/Data/Registry/Solver.hs
--- a/src/Data/Registry/Solver.hs
+++ b/src/Data/Registry/Solver.hs
@@ -18,17 +18,17 @@
 import           GHC.TypeLits
 
 -- | Compute the list of input types for a function
-type family Inputs f :: [*] where
+type family Inputs f :: [Type] where
   Inputs (i -> o) = i ': Inputs o
   Inputs x = '[]
 
 -- | Compute the output type for a function
-type family Output f :: * where
+type family Output f :: Type where
   Output (i -> o) = Output o
   Output x = x
 
 -- | Compute if a type is contained in a list of types
-type family Contains (a :: *) (els :: [*]) :: Constraint where
+type family Contains (a :: Type) (els :: [Type]) :: Constraint where
   Contains a '[] = TypeError (Text "No element of type " ':<>: 'ShowType a ':<>: 'Text " can be built out of the registry")
   Contains a (a ': els) = ()
   Contains a (b ': els) = Contains a els
@@ -38,13 +38,13 @@
 
 -- | Compute if each element of a list of types is contained in
 -- another list
-class IsSubset (ins :: [*]) (out :: [*])
+class IsSubset (ins :: [Type]) (out :: [Type])
 instance IsSubset '[] out
 instance (Contains a out, IsSubset els out) => IsSubset (a ': els) out
 
 -- | From the list of all the input types and outputs types of a registry
 --   Can we create all the output types?
-class Solvable (ins :: [*]) (out :: [*])
+class Solvable (ins :: [Type]) (out :: [Type])
 instance (IsSubset ins out) => Solvable ins out
 
 
@@ -57,12 +57,12 @@
   (x ': xs) :++ ys = x ': (xs :++ ys)
 
 -- | Return '[a] only if it is not already in the list of types
-type family FindUnique (a :: *) (as :: [*]) :: [*] where
+type family FindUnique (a :: Type) (as :: [Type]) :: [Type] where
   FindUnique a '[] = '[a]
   FindUnique a (a ': rest) = '[]
   FindUnique a (b ': rest) = FindUnique a rest
 
-type family Normalized (as :: [*]) :: [*] where
+type family Normalized (as :: [Type]) :: [Type] where
   Normalized '[] = '[]
   Normalized '[a] = '[a]
   Normalized (a ': rest) = FindUnique a rest :++ Normalized rest
diff --git a/test/Test/Data/Registry/SmallExample.hs b/test/Test/Data/Registry/SmallExample.hs
--- a/test/Test/Data/Registry/SmallExample.hs
+++ b/test/Test/Data/Registry/SmallExample.hs
@@ -11,7 +11,6 @@
 
 import           Data.Registry
 import           Data.Text             (splitOn)
-import           Data.Typeable         (Typeable)
 import           Protolude             as P
 import           Test.Tasty.Extensions hiding (run)
 
diff --git a/test/Test/Tutorial/Application.hs b/test/Test/Tutorial/Application.hs
--- a/test/Test/Tutorial/Application.hs
+++ b/test/Test/Tutorial/Application.hs
@@ -3,7 +3,6 @@
 module Test.Tutorial.Application where
 
 import qualified Data.ByteString.Char8 as BS8
-import           Data.Text.Encoding    (decodeUtf8)
 import           Protolude
 import           System.Directory      (doesFileExist)
 import           System.Random
diff --git a/test/Test/Tutorial/Exercise5.hs b/test/Test/Tutorial/Exercise5.hs
--- a/test/Test/Tutorial/Exercise5.hs
+++ b/test/Test/Tutorial/Exercise5.hs
@@ -6,7 +6,6 @@
 
 import qualified Data.ByteString.Char8     as BS8
 import           Data.Registry
-import           Data.Text.Encoding        (decodeUtf8)
 import           Protolude
 import           System.Directory          (doesFileExist)
 import           Test.Tutorial.Application
@@ -16,7 +15,7 @@
   exists <- doesFileExist (toS path)
   if not exists then fileDoesNotExist else pure ()
   pure SecretReader {
-    readSecret = do
+    readSecret =
       if exists then Just . decodeUtf8 <$> BS8.readFile (toS path)
       else fileDoesNotExist $> Nothing
     }
diff --git a/test/Test/Tutorial/Exercise8.hs b/test/Test/Tutorial/Exercise8.hs
--- a/test/Test/Tutorial/Exercise8.hs
+++ b/test/Test/Tutorial/Exercise8.hs
@@ -21,8 +21,10 @@
 
 $(return [])
 
+{-
 -- this does not compile
--- checkedIncorrectRegistry = $(checkRegistry 'incorrectRegistry)
+checkedIncorrectRegistry = $(checkRegistry 'incorrectRegistry)
+-}
 
 newErasedApp :: App
 newErasedApp = makeUnsafe @App erasedRegistry
