diff --git a/Data/Constraint.hs b/Data/Constraint.hs
--- a/Data/Constraint.hs
+++ b/Data/Constraint.hs
@@ -8,14 +8,16 @@
 {-# LANGUAGE EmptyDataDecls #-}
 {-# LANGUAGE KindSignatures #-}
 {-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE Trustworthy #-}
 {-# LANGUAGE Rank2Types #-}
 {-# LANGUAGE GADTs #-}
-{-# LANGUAGE Safe #-}
 
 module Data.Constraint
   (
+  -- * Constraints
+    Constraint
   -- * Dictionary
-    Dict(Dict)
+  , Dict(Dict)
   -- * Entailment
   , (:-)(Sub)
   , (\\)
@@ -33,6 +35,7 @@
 import Data.Monoid
 import Data.Complex
 import Data.Ratio
+import GHC.Prim (Constraint)
 
 -- | Capture a dictionary for a given constraint
 data Dict :: Constraint -> * where
diff --git a/Data/Constraint/Unsafe.hs b/Data/Constraint/Unsafe.hs
--- a/Data/Constraint/Unsafe.hs
+++ b/Data/Constraint/Unsafe.hs
@@ -10,6 +10,8 @@
 
 module Data.Constraint.Unsafe
   ( evil
+  , derive
+  , underive
   -- * Sugar
   , applicative
   , alternative
@@ -17,11 +19,18 @@
 
 import Control.Applicative
 import Control.Monad
+import Control.Newtype
 import Data.Constraint
 import Unsafe.Coerce
 
 evil :: a :- b
 evil = unsafeCoerce refl
+
+derive :: Newtype n o => (o -> n) -> t o :- t n
+derive _ = evil
+
+underive :: Newtype n o => (o -> n) -> t n :- t o
+underive _ = evil
 
 applicative :: forall m a. Monad m => (Applicative m => m a) -> m a
 applicative m = m \\ trans (evil :: Applicative (WrappedMonad m) :- Applicative m) ins
diff --git a/constraints.cabal b/constraints.cabal
--- a/constraints.cabal
+++ b/constraints.cabal
@@ -1,6 +1,6 @@
 name:          constraints
 category:      Constraints
-version:       0.1
+version:       0.2
 license:       BSD3
 cabal-version: >= 1.10
 license-file:  LICENSE
@@ -31,7 +31,10 @@
     Rank2Types,
     GADTs
 
-  build-depends: base >= 4.4 && < 5
+  build-depends: 
+    base >= 4.4 && < 5,
+    newtype >= 0.2 && < 0.3,
+    ghc-prim
   exposed-modules:
     Data.Constraint
     Data.Constraint.Forall
