diff --git a/src/Data/ULID.hs b/src/Data/ULID.hs
--- a/src/Data/ULID.hs
+++ b/src/Data/ULID.hs
@@ -27,6 +27,7 @@
 -}
 
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Data.ULID (
     ULID(..),
     getULIDTime,
@@ -43,6 +44,7 @@
 import           Data.Monoid           ((<>))
 import           Data.Text as T
 import           Data.Time.Clock.POSIX
+import           GHC.Generics
 import           System.IO.Unsafe
 import qualified System.Random         as R
 
@@ -60,13 +62,13 @@
   { timeStamp :: !ULIDTimeStamp
   , random    :: !ULIDRandom
   }
-  deriving (Eq, Typeable, Data)
+  deriving (Eq, Typeable, Data, Generic)
 
 instance Ord ULID where
     compare (ULID ts1 _) (ULID ts2 _) = compare ts1 ts2
 
 instance Show ULID where
-    show (ULID ts bytes) = (show ts) ++ (show bytes)
+    show (ULID ts bytes) = show ts ++ show bytes
 
 instance Read ULID where
     readsPrec _ str = do
@@ -87,7 +89,7 @@
 -- but since the work to put it here has already been done
 -- it's no harm to leave it in.
 instance NFData ULID where
-    rnf (ULID ts bytes) = rnf ts `seq` (rnf bytes `seq` ())
+    rnf (ULID ts bytes) = rnf ts `seq` rnf bytes
 
 instance R.Random ULID where
     randomR _ = R.random -- ignore range
@@ -95,7 +97,6 @@
         t <- getULIDTimeStamp
         let (r, g') = mkULIDRandom g
         return (ULID t r, g')
-    randomIO = getULID
 
 instance Hashable ULID where
     hashWithSalt salt ulid = hashWithSalt salt (encode ulid)
@@ -126,7 +127,8 @@
 -- than storing the shown `Text`,
 -- but still human-readable unlike the Binary version.
 ulidToInteger :: ULID -> Integer
-ulidToInteger = roll.(LBS.unpack).encode
+ulidToInteger =
+    roll . LBS.unpack . encode
 
 
 -- | Convert a ULID from its corresponding 128-bit Integer.
@@ -138,7 +140,7 @@
     | n > maxValidInteger = Left
         "Value must not be larger than the maximum safe Integer size (128 bits)"
     | otherwise = Right
-        . decode . LBS.pack . (unroll 16) $ n  -- 16 bytes = 128 bit
+        . decode . LBS.pack . unroll 16 $ n  -- 16 bytes = 128 bit
   where
     maxValidInteger :: Integer
     maxValidInteger = (2 ^ 128) - 1
diff --git a/src/Data/ULID/Base32.hs b/src/Data/ULID/Base32.hs
--- a/src/Data/ULID/Base32.hs
+++ b/src/Data/ULID/Base32.hs
@@ -137,7 +137,7 @@
   -> i  -- ^ Natural number to encode
   -> Text  -- ^ 0 padded, Douglas Crockford's base 32 encoded Text
 encode width =
-  (leftpad $ clampZero width) . encodePlain . clampZero
+  leftpad (clampZero width) . encodePlain . clampZero
 
 
 -- | >>> decode 5 "0003V"
diff --git a/src/Data/ULID/Random.hs b/src/Data/ULID/Random.hs
--- a/src/Data/ULID/Random.hs
+++ b/src/Data/ULID/Random.hs
@@ -2,6 +2,7 @@
 -- either with PRNGs or TRNGs.
 
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Data.ULID.Random (
     ULIDRandom,
     mkCryptoULIDRandom,
@@ -19,6 +20,7 @@
 import Data.Maybe
 import Data.Word
 import Data.Text as T hiding (split, take)
+import GHC.Generics
 import System.Random
 
 
@@ -27,21 +29,21 @@
 
 -- | Newtype wrapping a `ByteString`
 newtype ULIDRandom = ULIDRandom BS.ByteString
-    deriving (Eq, Typeable, Data)
+    deriving (Eq, Typeable, Data, Generic)
 
 instance Show ULIDRandom where
-    show (ULIDRandom r) = T.unpack $ B32.encode 16.roll.(BS.unpack) $ r
+    show (ULIDRandom r) = T.unpack $ B32.encode 16 . roll . BS.unpack $ r
 
 instance Read ULIDRandom where
   readsPrec _ = fmap
     (\(int, rest) ->
         (ULIDRandom $ BS.pack $ unroll numBytes int, T.unpack rest))
-    . (B32.decode $ 16)
+    . B32.decode 16
     . T.pack
 
 instance Binary ULIDRandom where
-    put (ULIDRandom r) = mapM_ put (BS.unpack $ r)
-    get = ULIDRandom <$> (BS.pack) <$> replicateM numBytes get
+    put (ULIDRandom r) = mapM_ put (BS.unpack r)
+    get = ULIDRandom . BS.pack <$> replicateM numBytes get
 
 instance NFData ULIDRandom where
     rnf (ULIDRandom r) = rnf r
@@ -66,7 +68,7 @@
 mkULIDRandom :: RandomGen g => g -> (ULIDRandom, g)
 mkULIDRandom g = let
   (g1, g2) = split g
-  genbytes = (BS.pack) . take numBytes . randoms
+  genbytes = BS.pack . take numBytes . randoms
   in (ULIDRandom $ genbytes g, g2)
 
 
@@ -75,4 +77,4 @@
 -- | Note: The call to `newStdGen` splits the generator,
 -- so this is safe to call multiple times
 getULIDRandom =
-  fst <$> mkULIDRandom <$> newStdGen
+  fst . mkULIDRandom <$> newStdGen
diff --git a/src/Data/ULID/TimeStamp.hs b/src/Data/ULID/TimeStamp.hs
--- a/src/Data/ULID/TimeStamp.hs
+++ b/src/Data/ULID/TimeStamp.hs
@@ -1,6 +1,7 @@
 -- | Custom data type for timestamps (milliseconds since 1970)
 
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Data.ULID.TimeStamp (
     ULIDTimeStamp,
     mkULIDTimeStamp,
@@ -16,6 +17,7 @@
 import           Data.Text as T
 import           Data.Time.Clock
 import           Data.Time.Clock.POSIX
+import           GHC.Generics
 
 import qualified Data.ULID.Base32 as B32
 
@@ -24,20 +26,20 @@
 
 -- | UNIX time in milliseconds
 newtype ULIDTimeStamp = ULIDTimeStamp Integer
-    deriving (Eq, Ord, Typeable, Data)
+    deriving (Eq, Ord, Typeable, Data, Generic)
 
 instance Show ULIDTimeStamp where
     show (ULIDTimeStamp i) = T.unpack $ B32.encode 10 i
 
 instance Read ULIDTimeStamp where
     readsPrec _ = fmap
-        (\(int, rest)->(ULIDTimeStamp int, T.unpack rest))
-        . (B32.decode) 10
+        (\(int, rest) -> (ULIDTimeStamp int, T.unpack rest))
+        . B32.decode 10
         . T.pack
 
 instance Binary ULIDTimeStamp where
     put (ULIDTimeStamp i) = mapM_ put (unroll numBytes i)
-    get = ULIDTimeStamp <$> roll <$> replicateM numBytes get
+    get = ULIDTimeStamp . roll <$> replicateM numBytes get
 
 instance NFData ULIDTimeStamp where
     rnf (ULIDTimeStamp i) = rnf i
diff --git a/test/Data/ULIDSpec.hs b/test/Data/ULIDSpec.hs
--- a/test/Data/ULIDSpec.hs
+++ b/test/Data/ULIDSpec.hs
@@ -75,6 +75,7 @@
         decode (encode a2) `shouldBe` a2
         encode a1 `shouldNotBe` encode a2
 
+    -- TODO: This can have race conditions
     it "encodes MSB first" $ do
         a1 <- getULIDTime 12345
         let e1 = encode a1
diff --git a/ulid.cabal b/ulid.cabal
--- a/ulid.cabal
+++ b/ulid.cabal
@@ -1,5 +1,5 @@
 name:                ulid
-version:             0.3.0.0
+version:             0.3.2.0
 synopsis:            Implementation of ULID - Universally Unique
                      Lexicographically Sortable Identifier
 description:         Implementation of Alizain Feerasta's ULID specification.
