diff --git a/registry.cabal b/registry.cabal
--- a/registry.cabal
+++ b/registry.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 5182f329ceb763878b463e07c0dba6c9691d5aba4925e9cd654317d86f7bf78f
+-- hash: ec8e2e4a28f9cfa59677d96e775326fb0b0e7bde8cbbc47719ff01cbdb5fecdc
 
 name:           registry
-version:        0.1.3.2
+version:        0.1.3.3
 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.
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
@@ -103,6 +103,11 @@
 (+:) :: (Typeable a) => Typed a -> Registry ins out -> Registry (Inputs a :++ ins) (Output a ': out)
 (+:) = register
 
+-- | Make the lists of types in the Registry unique, either for better display
+--   or for faster compile-time resolution with the make function
+normalize :: Registry ins out -> Registry (Normalized ins) (Normalized out)
+normalize (Registry vs fs ss ms) = Registry vs fs ss ms
+
 -- | The empty Registry
 end :: Registry '[] '[]
 end = Registry (Values []) (Functions []) (Specializations []) (Modifiers [])
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
@@ -1,8 +1,9 @@
-{-# LANGUAGE ConstraintKinds       #-}
-{-# LANGUAGE DataKinds             #-}
-{-# LANGUAGE PolyKinds             #-}
-{-# LANGUAGE TypeFamilies          #-}
-{-# LANGUAGE UndecidableInstances  #-}
+{-# LANGUAGE ConstraintKinds      #-}
+{-# LANGUAGE DataKinds            #-}
+{-# LANGUAGE PolyKinds            #-}
+{-# LANGUAGE TypeFamilies         #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# OPTIONS_GHC -fno-warn-unticked-promoted-constructors #-}
 
 {- |
   Type level functions to statically assess
@@ -28,7 +29,7 @@
 
 -- | Compute if a type is contained in a list of types
 type family Contains (a :: *) (els :: [*]) :: Constraint where
-  Contains a '[] = TypeError ('Text "No element of type " ':<>: 'ShowType a ':<>: 'Text " can be built out of the registry")
+  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
 
@@ -54,3 +55,14 @@
 type family (:++) (x :: [k]) (y :: [k]) :: [k] where
   '[]       :++ xs = xs
   (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
+  FindUnique a '[] = '[a]
+  FindUnique a (a ': rest) = '[]
+  FindUnique a (b ': rest) = FindUnique a rest
+
+type family Normalized (as :: [*]) :: [*] where
+  Normalized '[] = '[]
+  Normalized '[a] = '[a]
+  Normalized (a ': rest) = FindUnique a rest :++ Normalized rest
diff --git a/test/Test/Data/Registry/GenSpec.hs b/test/Test/Data/Registry/GenSpec.hs
--- a/test/Test/Data/Registry/GenSpec.hs
+++ b/test/Test/Data/Registry/GenSpec.hs
@@ -98,7 +98,7 @@
 -- * WITH VARIANTS
 
 registry' =
-     fun (sequence . replicate @(Gen Salary) 10)
+     fun (sequence . replicate @(Gen Salary) 100)
   +: fun salaryGen
   +: funTo @Gen (tag @"Fixed" Fixed)
   +: funTo @Gen (tag @"Variable" Variable)
diff --git a/test/Test/Data/Registry/SimpleExamples.hs b/test/Test/Data/Registry/SimpleExamples.hs
--- a/test/Test/Data/Registry/SimpleExamples.hs
+++ b/test/Test/Data/Registry/SimpleExamples.hs
@@ -40,9 +40,8 @@
 toText2 :: Text1 -> Text2
 toText2 (Text1 t) = Text2 t
 
-registry1 :: Registry (Inputs Int :++ '[Int, Int, Text, Text1])
-                      '[Output Int, Text, Text1, Text2]
-registry1 =
+registry1 :: Registry [Int, Text, Text1] [Int, Text, Text1, Text2]
+registry1 = normalize $
      val int1
   +: fun add1
   +: fun add2
@@ -67,7 +66,7 @@
 countSize1 :: Text -> Int1
 countSize1 t = Int1 (T.length t)
 
-registry2 :: Registry (Inputs Int :++ '[Int, Text]) '[Output Int, Text, Int1]
+registry2 :: Registry '[Int, Text] '[Int, Text, Int1]
 registry2 =
      fun int1
   +: fun add1
@@ -89,8 +88,7 @@
 unknown :: Double -> Text1
 unknown _ = Text1 "text1"
 
-registry3 :: Registry (Inputs Int :++ '[Double, Int, Text])
-                      '[Output Int, Text1, Text, Int1]
+registry3 :: Registry [Double, Int, Text] [Int, Text1, Text, Int1]
 registry3 =
      val int1
   +: fun unknown
