diff --git a/src/SuperRecord.hs b/src/SuperRecord.hs
--- a/src/SuperRecord.hs
+++ b/src/SuperRecord.hs
@@ -34,6 +34,7 @@
     , RecNfData(..)
     , RecSize, RemoveAccessTo
     , FldProxy(..), RecDeepTy
+    , KeyDoesNotExist
     )
 where
 
@@ -114,7 +115,10 @@
 {-# INLINE unsafeRnil #-}
 
 -- | Prepend a record entry to a record 'Rec'
-rcons :: forall l t lts s. (RecSize lts ~ s, KnownNat s) => l := t -> Rec lts -> Rec (l := t ': lts)
+rcons ::
+    forall l t lts s.
+    (RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts)
+    => l := t -> Rec lts -> Rec (l := t ': lts)
 rcons (_ := val) (Rec vec) =
     Rec $
     unsafePerformIO $!
@@ -130,7 +134,9 @@
 -- 'unsafeRnil' and still has enough free slots, mutates the original 'Rec' which should
 -- not be reused after
 unsafeRCons ::
-    forall l t lts s. (RecSize lts ~ s, KnownNat s) => l := t -> Rec lts -> Rec (l := t ': lts)
+    forall l t lts s.
+    (RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts)
+    => l := t -> Rec lts -> Rec (l := t ': lts)
 unsafeRCons (_ := val) (Rec vec) =
     Rec $
     unsafePerformIO $!
@@ -142,12 +148,23 @@
 {-# INLINE unsafeRCons #-}
 
 -- | Alias for 'rcons'
-(&) :: forall l t lts s. (RecSize lts ~ s, KnownNat s) => l := t -> Rec lts -> Rec (l := t ': lts)
+(&) ::
+    forall l t lts s.
+    (RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts)
+    => l := t -> Rec lts -> Rec (l := t ': lts)
 (&) = rcons
 {-# INLINE (&) #-}
 
 infixr 5 &
 
+type family KeyDoesNotExist (l :: Symbol) (lts :: [*]) :: Constraint where
+    KeyDoesNotExist l '[] = 'True ~ 'True
+    KeyDoesNotExist l (l := t ': lts) =
+        TypeError
+        ( 'Text "Duplicate key " ':<>: 'Text l
+        )
+    KeyDoesNotExist q (l := t ': lts) = KeyDoesNotExist q lts
+
 type family RecSize (lts :: [*]) :: Nat where
     RecSize '[] = 0
     RecSize (l := t ': lts) = 1 + RecSize lts
@@ -357,7 +374,7 @@
 
 instance
     ( KnownSymbol l, FromJSON t, RecJsonParse lts
-    , RecSize lts ~ s, KnownNat s
+    , RecSize lts ~ s, KnownNat s, KeyDoesNotExist l lts
     ) => RecJsonParse (l := t ': lts) where
     recJsonParse initSize obj =
         do let lbl :: FldProxy l
diff --git a/superrecord.cabal b/superrecord.cabal
--- a/superrecord.cabal
+++ b/superrecord.cabal
@@ -1,5 +1,5 @@
 name:                superrecord
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            Supercharged anonymous records
 description:         Anonymous records with various useful utilities
 homepage:            https://github.com/agrafix/superrecord#readme
@@ -16,13 +16,13 @@
 library
   hs-source-dirs:      src
   exposed-modules:     SuperRecord
-  build-depends:       base >= 4.7 && < 5
+  build-depends:       base >= 4.9 && < 5
                      , primitive >= 0.6
                      , constraints
-                     , aeson
-                     , text
-                     , deepseq
-                     , ghc-prim
+                     , aeson >= 1.0
+                     , text >= 1.2
+                     , deepseq >= 1.4
+                     , ghc-prim >= 0.5
   default-language:    Haskell2010
   ghc-options:         -Wall -O2
 
