diff --git a/purescript-iso.cabal b/purescript-iso.cabal
--- a/purescript-iso.cabal
+++ b/purescript-iso.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 5a8f0bf52c2d05c29489bec4ce87c26941be52640d60ae91078e9fe8470a6fdf
+-- hash: ca2f0181c9dc623b5d3b883c1e50bf817a79ecdc527e6b7c2283e063662be81f
 
 name:           purescript-iso
-version:        0.0.2.1
+version:        0.0.3
 synopsis:       Isomorphic trivial data type definitions over JSON
 description:    Please see the README on GitHub at <https://github.com/githubuser/purescript-iso#readme>
 category:       Web
@@ -55,6 +55,7 @@
     , base >=4.7 && <5
     , bytestring
     , containers
+    , deepseq
     , emailaddress >=0.2.0.0
     , monad-control
     , mtl
@@ -89,6 +90,7 @@
     , base >=4.7 && <5
     , bytestring
     , containers
+    , deepseq
     , emailaddress >=0.2.0.0
     , monad-control
     , mtl
diff --git a/src/Data/Aeson/JSONDateTime.hs b/src/Data/Aeson/JSONDateTime.hs
--- a/src/Data/Aeson/JSONDateTime.hs
+++ b/src/Data/Aeson/JSONDateTime.hs
@@ -7,9 +7,10 @@
 
 import Data.Time
   ( UTCTime, formatTime, iso8601DateFormat, defaultTimeLocale
-  , getCurrentTime, parseTimeOrError)
+  , getCurrentTime)
 import Data.Aeson (ToJSON, FromJSON, decode)
 import qualified Data.ByteString.Lazy.UTF8 as LBS8
+import Control.DeepSeq (NFData)
 import Test.QuickCheck (Arbitrary (..))
 import GHC.Generics (Generic)
 import System.IO.Unsafe (unsafePerformIO)
@@ -17,7 +18,7 @@
 
 newtype JSONDateTime = JSONDateTime
   { getJSONDateTime :: UTCTime
-  } deriving (Eq, Ord, Show, Generic, ToJSON, FromJSON)
+  } deriving (Eq, Ord, Show, Generic, ToJSON, FromJSON, NFData)
 
 
 jsonDateTime :: UTCTime -> JSONDateTime
diff --git a/src/Data/Aeson/JSONEither.hs b/src/Data/Aeson/JSONEither.hs
--- a/src/Data/Aeson/JSONEither.hs
+++ b/src/Data/Aeson/JSONEither.hs
@@ -1,12 +1,14 @@
 {-# LANGUAGE
     OverloadedStrings
   , DeriveGeneric
+  , DeriveAnyClass
   #-}
 
 module Data.Aeson.JSONEither where
 
 import Data.Aeson (ToJSON (..), FromJSON (..), Value (Object), object, (.=), (.:))
 import Data.Aeson.Types (typeMismatch)
+import Control.DeepSeq (NFData)
 import Control.Applicative ((<|>))
 import Test.QuickCheck (Arbitrary (..))
 import Test.QuickCheck.Gen (oneof)
@@ -16,7 +18,7 @@
 data JSONEither a b
   = JSONLeft a
   | JSONRight b
-  deriving (Eq, Ord, Show, Generic)
+  deriving (Eq, Ord, Show, Generic, NFData)
 
 instance (ToJSON a, ToJSON b) => ToJSON (JSONEither a b) where
   toJSON x = case x of
diff --git a/src/Data/Aeson/JSONEmailAddress.hs b/src/Data/Aeson/JSONEmailAddress.hs
--- a/src/Data/Aeson/JSONEmailAddress.hs
+++ b/src/Data/Aeson/JSONEmailAddress.hs
@@ -7,10 +7,10 @@
 
 import Text.EmailAddress (EmailAddress, emailAddressFromString)
 import Data.Aeson (ToJSON, FromJSON)
-import qualified Data.Char as Char
 import Control.Monad (replicateM)
+import Control.DeepSeq (NFData (..))
 import Test.QuickCheck (Arbitrary (..))
-import Test.QuickCheck.Gen (elements, scale, choose)
+import Test.QuickCheck.Gen (elements, choose)
 import GHC.Generics (Generic)
 
 -- FIXME restrict to 64 x 63 chars
@@ -18,6 +18,9 @@
 newtype JSONEmailAddress = JSONEmailAddress
   { getJSONEmailAddress :: EmailAddress
   } deriving (Eq, Ord, Show, Generic, FromJSON, ToJSON)
+
+instance NFData JSONEmailAddress where
+  rnf (JSONEmailAddress x) = seq x ()
 
 instance Arbitrary JSONEmailAddress where
   arbitrary = do
diff --git a/src/Data/Aeson/JSONInt.hs b/src/Data/Aeson/JSONInt.hs
--- a/src/Data/Aeson/JSONInt.hs
+++ b/src/Data/Aeson/JSONInt.hs
@@ -7,12 +7,12 @@
 
 import Data.Aeson (ToJSON, FromJSON)
 import Data.Int (Int32)
+import Control.DeepSeq (NFData)
 import GHC.Generics (Generic)
 import Test.QuickCheck (Arbitrary (..))
-import Test.QuickCheck.Gen (scale)
-import System.IO.Unsafe (unsafePerformIO)
 
 
 newtype JSONInt = JSONInt
   { getJSONInt :: Int32
-  } deriving (Eq, Ord, Enum, Show, Read, Generic, Num, Real, Integral, ToJSON, FromJSON, Arbitrary)
+  } deriving ( Eq, Ord, Enum, Show, Read, Generic, Num, Real, Integral
+             , ToJSON, FromJSON, Arbitrary, NFData)
diff --git a/src/Data/Aeson/JSONInteger.hs b/src/Data/Aeson/JSONInteger.hs
--- a/src/Data/Aeson/JSONInteger.hs
+++ b/src/Data/Aeson/JSONInteger.hs
@@ -7,19 +7,17 @@
 
 import Data.Aeson (ToJSON (..), FromJSON (..), Value (String))
 import Data.Aeson.Types (typeMismatch)
-import Data.Aeson.Attoparsec (attoAeson)
-import Data.Attoparsec.Text (decimal, signed)
 import Data.Scientific (Scientific, coefficient, base10Exponent, scientific)
 import qualified Data.Text as T
 import Text.Read (readMaybe)
+import Control.DeepSeq (NFData)
 import GHC.Generics (Generic)
 import Test.QuickCheck (Arbitrary (..))
-import Test.QuickCheck.Gen (scale, elements, listOf1)
-import System.IO.Unsafe (unsafePerformIO)
+import Test.QuickCheck.Gen (elements, listOf1)
 
 
 newtype JSONInteger = JSONInteger Scientific
-  deriving (Eq, Ord, Show, Read, Generic, Num, Real)
+  deriving (Eq, Ord, Show, Read, Generic, Num, Real, NFData)
 
 instance Enum JSONInteger where
   toEnum = jsonInteger . fromIntegral
@@ -75,6 +73,3 @@
         s <- listOf1 (elements ['0'..'9'])
         case readMaybe s of
           Just x -> pure x
-      go x = unsafePerformIO $ do
-        print x
-        pure x
diff --git a/src/Data/Aeson/JSONScientific.hs b/src/Data/Aeson/JSONScientific.hs
--- a/src/Data/Aeson/JSONScientific.hs
+++ b/src/Data/Aeson/JSONScientific.hs
@@ -7,20 +7,18 @@
 
 import Data.Aeson (ToJSON (..), FromJSON (..), Value (String))
 import Data.Aeson.Types (typeMismatch)
-import Data.Aeson.Attoparsec (attoAeson)
-import Data.Attoparsec.Text (decimal, signed)
 import Data.Scientific (Scientific, coefficient, base10Exponent)
 import qualified Data.Text as T
 import Text.Read (readMaybe)
+import Control.DeepSeq (NFData)
 import GHC.Generics (Generic)
 import Test.QuickCheck (Arbitrary (..))
-import Test.QuickCheck.Gen (scale, elements, listOf1, listOf)
-import System.IO.Unsafe (unsafePerformIO)
+import Test.QuickCheck.Gen (elements, listOf1, listOf)
 
 
 newtype JSONScientific = JSONScientific
   { getJSONScientific :: Scientific
-  } deriving (Eq, Ord{-, Enum-}, Show, Read, Generic, Num, Real{-, Integral-})
+  } deriving (Eq, Ord, Show, Read, Generic, Num, Real, NFData, Fractional)
 
 instance ToJSON JSONScientific where
   toJSON (JSONScientific x) = toJSON $
@@ -61,6 +59,3 @@
         p <- listOf (elements ['0'..'9'])
         case readMaybe (s ++ (if length p == 0 then "" else "." ++ p)) of
           Just x -> pure x
-      go x = unsafePerformIO $ do
-        print x
-        pure x
diff --git a/src/Data/Aeson/JSONString.hs b/src/Data/Aeson/JSONString.hs
--- a/src/Data/Aeson/JSONString.hs
+++ b/src/Data/Aeson/JSONString.hs
@@ -4,28 +4,16 @@
   , DeriveGeneric
   #-}
 
-module Data.Aeson.JSONString (JSONString, jsonString, getJSONString) where
+module Data.Aeson.JSONString (JSONString (..)) where
 
-import Data.Monoid ((<>))
 import Data.Text (Text)
-import qualified Data.Text as T
 import Data.Aeson (ToJSON, FromJSON)
+import Data.String (IsString)
+import Control.DeepSeq (NFData)
 import GHC.Generics (Generic)
-import Test.QuickCheck (Arbitrary (..))
+import Test.QuickCheck (Arbitrary)
 import Test.QuickCheck.Instances ()
 
 
 newtype JSONString = JSONString Text
-  deriving (Eq, Ord, Generic, ToJSON, FromJSON)
-
-
-jsonString :: Text -> JSONString
-jsonString = JSONString -- . T.pack . show
-
-
-getJSONString :: JSONString -> Text
-getJSONString (JSONString x) = x -- T.pack $ read $ T.unpack x
-
-
-instance Arbitrary JSONString where
-  arbitrary = jsonString <$> arbitrary
+  deriving (Eq, Ord, Generic, ToJSON, FromJSON, NFData, IsString, Arbitrary)
diff --git a/src/Data/Aeson/JSONTuple.hs b/src/Data/Aeson/JSONTuple.hs
--- a/src/Data/Aeson/JSONTuple.hs
+++ b/src/Data/Aeson/JSONTuple.hs
@@ -1,18 +1,20 @@
 {-# LANGUAGE
     OverloadedStrings
   , DeriveGeneric
+  , DeriveAnyClass
   #-}
 
 module Data.Aeson.JSONTuple where
 
 import Data.Aeson (ToJSON (..), FromJSON (..), Value (Object), object, (.=), (.:))
 import Data.Aeson.Types (typeMismatch)
+import Control.DeepSeq (NFData)
 import Test.QuickCheck (Arbitrary (..))
 import GHC.Generics (Generic)
 
 
 data JSONTuple a b = JSONTuple a b
-  deriving (Eq, Ord, Show, Generic)
+  deriving (Eq, Ord, Show, Generic, NFData)
 
 instance (ToJSON a, ToJSON b) => ToJSON (JSONTuple a b) where
   toJSON (JSONTuple a b) = object ["l" .= a, "r" .= b]
diff --git a/src/Data/Aeson/JSONUnit.hs b/src/Data/Aeson/JSONUnit.hs
--- a/src/Data/Aeson/JSONUnit.hs
+++ b/src/Data/Aeson/JSONUnit.hs
@@ -1,18 +1,20 @@
 {-# LANGUAGE
     OverloadedStrings
   , DeriveGeneric
+  , DeriveAnyClass
   #-}
 
 module Data.Aeson.JSONUnit where
 
 import Data.Aeson (ToJSON (..), FromJSON (..), Value (String))
 import Data.Aeson.Types (typeMismatch)
+import Control.DeepSeq (NFData)
 import Test.QuickCheck (Arbitrary (..))
 import GHC.Generics (Generic)
 
 
 data JSONUnit = JSONUnit
-  deriving (Eq, Ord, Show, Generic)
+  deriving (Eq, Ord, Show, Generic, NFData)
 
 instance Arbitrary JSONUnit where
   arbitrary = pure JSONUnit
diff --git a/src/Data/Aeson/JSONVoid.hs b/src/Data/Aeson/JSONVoid.hs
--- a/src/Data/Aeson/JSONVoid.hs
+++ b/src/Data/Aeson/JSONVoid.hs
@@ -1,17 +1,19 @@
 {-# LANGUAGE
     OverloadedStrings
   , DeriveGeneric
+  , DeriveAnyClass
   #-}
 
 module Data.Aeson.JSONVoid where
 
 import Data.Aeson (ToJSON (..), FromJSON (..), Value (String))
 import Data.Aeson.Types (typeMismatch)
+import Control.DeepSeq (NFData)
 import GHC.Generics (Generic)
 
 
 data JSONVoid
-  deriving (Generic)
+  deriving (Generic, NFData)
 
 instance ToJSON JSONVoid where
   toJSON _ = String ""
