diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,5 @@
+# Revision history for prim-instances
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2018, chessai
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of chessai nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/prim-instances.cabal b/prim-instances.cabal
new file mode 100644
--- /dev/null
+++ b/prim-instances.cabal
@@ -0,0 +1,38 @@
+name:                prim-instances
+version:             0.1.0.0
+synopsis:            prim typeclass instances
+description:         orphan instances for primitive's 'Prim' typeclass.
+                     Types which abstract over a single primitive type
+                     have trivially lawful and sometimes useful instances.
+homepage:            https://github.com/chessai/prim-instances.git
+license:             BSD3
+license-file:        LICENSE
+author:              chessai
+maintainer:          chessai1996@gmail.com
+copyright:           2018 (c) chessai
+category:            Data
+build-type:          Simple
+extra-source-files:  ChangeLog.md
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     Data.Primitive.Instances
+  build-depends:       base >=4.7 && <4.13, primitive >= 0.6.4.0
+  hs-source-dirs:      src
+  default-language:    Haskell2010
+
+test-suite test
+  default-language: Haskell2010
+  hs-source-dirs: test
+  main-is: main.hs
+  type: exitcode-stdio-1.0
+  build-depends:
+       base >= 4.7 && < 4.12
+     , QuickCheck
+     , base-orphans
+     , quickcheck-classes >= 0.4.11.1
+     , quickcheck-instances
+     , primitive >= 0.6.4.0 
+     , prim-instances 
+     , tasty
+     , tasty-quickcheck
diff --git a/src/Data/Primitive/Instances.hs b/src/Data/Primitive/Instances.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Primitive/Instances.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE BangPatterns               #-}
+{-# LANGUAGE CPP                        #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE InstanceSigs               #-}
+{-# LANGUAGE MagicHash                  #-}
+{-# LANGUAGE ScopedTypeVariables        #-}
+{-# LANGUAGE StandaloneDeriving         #-}
+#if __GLASGOW_HASKELL__ >= 800
+{-# LANGUAGE TypeInType                 #-}
+#endif
+{-# LANGUAGE UnboxedTuples              #-}
+
+{-# OPTIONS_GHC
+      -Weverything
+      -fno-warn-unsafe
+      -fno-warn-orphans
+      -fno-warn-name-shadowing
+      -fno-warn-missing-import-lists
+      -fno-warn-implicit-prelude
+      -O2
+#-}
+
+-- | Orphan instances for the 'Prim' typeclass.
+module Data.Primitive.Instances () where
+
+import Data.Complex (Complex(..))
+import Data.Functor.Const (Const(..))
+#if MIN_VERSION_base(4,8,0)
+import Data.Functor.Identity (Identity(..))
+#endif
+import qualified Data.Monoid as Monoid
+import qualified Data.Semigroup as Semigroup
+import Data.Ord (Down(..))
+--import Data.Primitive.ByteArray
+import Data.Primitive.Types (Prim(..), defaultSetOffAddr#, defaultSetByteArray#)
+import GHC.Real (Ratio(..))
+import Data.Word (Word64)
+import GHC.Fingerprint (Fingerprint(..))
+import GHC.Exts (State#, Int#, Addr#, MutableByteArray#, (+#), (*#))
+
+instance Prim a => Prim (Complex a) where
+  sizeOf# _ = 2# *# sizeOf# (undefined :: a)
+  alignment# _ = alignment# (undefined :: a)
+  indexByteArray# arr# i# =
+    let x,y :: a
+        x = indexByteArray# arr# (2# *# i#)
+        y = indexByteArray# arr# (2# *# i# +# 1#) 
+    in x :+ y
+  readByteArray# :: forall s a. (Prim a) => MutableByteArray# s -> Int# -> State# s -> (# State# s, Complex a #)
+  readByteArray# arr# i# =
+    \s0 -> case readByteArray# arr# (2# *# i#) s0 of
+      (# s1#, x #) -> case readByteArray# arr# (2# *# i# +# 1#) s1# of
+        (# s2#, y #) -> (# s2#, x :+ y #)
+  writeByteArray# :: forall s a. (Prim a) => MutableByteArray# s -> Int# -> Complex a -> State# s -> State# s
+  writeByteArray# arr# i# (a :+ b) =
+    \s0 -> case writeByteArray# arr# (2# *# i#) a s0 of
+      s1 -> case writeByteArray# arr# (2# *# i# +# 1#) b s1 of
+        s2 -> s2
+  setByteArray# = defaultSetByteArray#
+  indexOffAddr# :: Addr# -> Int# -> Complex a
+  indexOffAddr# addr# i# =
+    let x,y :: a
+        x = indexOffAddr# addr# (2# *# i#)
+        y = indexOffAddr# addr# (2# *# i# +# 1#)
+    in x :+ y
+  readOffAddr# :: forall s a. (Prim a) => Addr# -> Int# -> State# s -> (# State# s, Complex a #)
+  readOffAddr# addr# i# =
+    \s0 -> case readOffAddr# addr# (2# *# i#) s0 of
+      (# s1, x #) -> case readOffAddr# addr# (2# *# i# +# 1#) s1 of
+        (# s2, y #) -> (# s2, x :+ y #)
+  writeOffAddr# :: forall s a. (Prim a) => Addr# -> Int# -> Complex a -> State# s -> State# s
+  writeOffAddr# addr# i# (a :+ b) =
+    \s0 -> case writeOffAddr# addr# (2# *# i#) a s0 of
+      s1 -> case writeOffAddr# addr# (2# *# i# +# 1#) b s1 of
+        s2 -> s2
+  setOffAddr# = defaultSetOffAddr#
+  {-# INLINE sizeOf# #-}
+  {-# INLINE alignment# #-}
+  {-# INLINE indexByteArray# #-}
+  {-# INLINE readByteArray# #-}
+  {-# INLINE writeByteArray# #-}
+  {-# INLINE setByteArray# #-}
+  {-# INLINE indexOffAddr# #-}
+  {-# INLINE readOffAddr# #-}
+  {-# INLINE writeOffAddr# #-}
+  {-# INLINE setOffAddr# #-}
+
+instance (Integral a, Prim a) => Prim (Ratio a) where
+  sizeOf# _ = 2# *# sizeOf# (undefined :: a) 
+  alignment# _ = alignment# (undefined :: a) 
+  indexByteArray# arr# i# =
+    let x,y :: a
+        x = indexByteArray# arr# (2# *# i#)
+        y = indexByteArray# arr# (2# *# i# +# 1#) 
+    in x :% y
+  readByteArray# :: forall s a. (Prim a) => MutableByteArray# s -> Int# -> State# s -> (# State# s, Ratio a #)
+  readByteArray# arr# i# =
+    \s0 -> case readByteArray# arr# (2# *# i#) s0 of
+      (# s1#, x #) -> case readByteArray# arr# (2# *# i# +# 1#) s1# of
+        (# s2#, y #) -> (# s2#, x :% y #)
+  writeByteArray# :: forall s a. (Prim a) => MutableByteArray# s -> Int# -> Ratio a -> State# s -> State# s
+  writeByteArray# arr# i# (a :% b) =
+    \s0 -> case writeByteArray# arr# (2# *# i#) a s0 of
+      s1 -> case writeByteArray# arr# (2# *# i# +# 1#) b s1 of
+        s2 -> s2
+  setByteArray# = defaultSetByteArray#
+  indexOffAddr# :: Addr# -> Int# -> Ratio a
+  indexOffAddr# addr# i# =
+    let x,y :: a
+        x = indexOffAddr# addr# (2# *# i#)
+        y = indexOffAddr# addr# (2# *# i# +# 1#)
+    in x :% y
+  readOffAddr# :: forall s a. (Prim a) => Addr# -> Int# -> State# s -> (# State# s, Ratio a #)
+  readOffAddr# addr# i# =
+    \s0 -> case readOffAddr# addr# (2# *# i#) s0 of
+      (# s1, x #) -> case readOffAddr# addr# (2# *# i# +# 1#) s1 of
+        (# s2, y #) -> (# s2, x :% y #)
+  writeOffAddr# :: forall s a. (Prim a) => Addr# -> Int# -> Ratio a -> State# s -> State# s
+  writeOffAddr# addr# i# (a :% b) =
+    \s0 -> case writeOffAddr# addr# (2# *# i#) a s0 of
+      s1 -> case writeOffAddr# addr# (2# *# i# +# 1#) b s1 of
+        s2 -> s2
+  setOffAddr# = defaultSetOffAddr#
+  {-# INLINE sizeOf# #-}
+  {-# INLINE alignment# #-}
+  {-# INLINE indexByteArray# #-}
+  {-# INLINE readByteArray# #-}
+  {-# INLINE writeByteArray# #-}
+  {-# INLINE setByteArray# #-}
+  {-# INLINE indexOffAddr# #-}
+  {-# INLINE readOffAddr# #-}
+  {-# INLINE writeOffAddr# #-}
+  {-# INLINE setOffAddr# #-}
+
+instance Prim Fingerprint where 
+  sizeOf# _ = 2# *# sizeOf# (undefined :: Word64)
+  alignment# _ = alignment# (undefined :: Word64)
+  indexByteArray# arr# i# =
+    let x,y :: Word64
+        x = indexByteArray# arr# (2# *# i#)
+        y = indexByteArray# arr# (2# *# i# +# 1#) 
+    in Fingerprint x y
+  readByteArray# :: forall s. MutableByteArray# s -> Int# -> State# s -> (# State# s, Fingerprint #)
+  readByteArray# arr# i# =
+    \s0 -> case readByteArray# arr# (2# *# i#) s0 of
+      (# s1#, x #) -> case readByteArray# arr# (2# *# i# +# 1#) s1# of
+        (# s2#, y #) -> (# s2#, Fingerprint x y #)
+  writeByteArray# :: forall s. MutableByteArray# s -> Int# -> Fingerprint -> State# s -> State# s
+  writeByteArray# arr# i# (Fingerprint a b) =
+    \s0 -> case writeByteArray# arr# (2# *# i#) a s0 of
+      s1 -> case writeByteArray# arr# (2# *# i# +# 1#) b s1 of
+        s2 -> s2
+  setByteArray# = defaultSetByteArray#
+  indexOffAddr# :: Addr# -> Int# -> Fingerprint
+  indexOffAddr# addr# i# =
+    let x,y :: Word64
+        x = indexOffAddr# addr# (2# *# i#)
+        y = indexOffAddr# addr# (2# *# i# +# 1#)
+    in Fingerprint x y
+  readOffAddr# :: forall s. Addr# -> Int# -> State# s -> (# State# s, Fingerprint #)
+  readOffAddr# addr# i# =
+    \s0 -> case readOffAddr# addr# (2# *# i#) s0 of
+      (# s1, x #) -> case readOffAddr# addr# (2# *# i# +# 1#) s1 of
+        (# s2, y #) -> (# s2, Fingerprint x y #)
+  writeOffAddr# :: forall s. Addr# -> Int# -> Fingerprint -> State# s -> State# s
+  writeOffAddr# addr# i# (Fingerprint a b) =
+    \s0 -> case writeOffAddr# addr# (2# *# i#) a s0 of
+      s1 -> case writeOffAddr# addr# (2# *# i# +# 1#) b s1 of
+        s2 -> s2
+  setOffAddr# = defaultSetOffAddr#
+  {-# INLINE sizeOf# #-}
+  {-# INLINE alignment# #-}
+  {-# INLINE indexByteArray# #-}
+  {-# INLINE readByteArray# #-}
+  {-# INLINE writeByteArray# #-}
+  {-# INLINE setByteArray# #-}
+  {-# INLINE indexOffAddr# #-}
+  {-# INLINE readOffAddr# #-}
+  {-# INLINE writeOffAddr# #-}
+  {-# INLINE setOffAddr# #-}
+
+deriving instance Prim a => Prim (Down a)
+#if MIN_VERSION_base(4,8,0)
+deriving instance Prim a => Prim (Identity a)
+deriving instance Prim a => Prim (Monoid.Dual a)
+deriving instance Prim a => Prim (Monoid.Sum a)
+deriving instance Prim a => Prim (Monoid.Product a)
+#endif
+#if MIN_VERSION_base(4,9,0)
+deriving instance Prim a => Prim (Semigroup.First a)
+deriving instance Prim a => Prim (Semigroup.Last a)
+deriving instance Prim a => Prim (Semigroup.Min a)
+deriving instance Prim a => Prim (Semigroup.Max a)
+#endif
+deriving instance Prim a => Prim (Const a b)
diff --git a/test/main.hs b/test/main.hs
new file mode 100644
--- /dev/null
+++ b/test/main.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE DeriveFunctor #-}
+
+import Data.Complex
+import Data.Proxy (Proxy(..))
+import Data.Ratio (Ratio(..))
+import Data.Word (Word64)
+import GHC.Fingerprint (Fingerprint)
+import Test.QuickCheck hiding (Fixed)
+import Test.QuickCheck.Gen (suchThat)
+import Test.QuickCheck.Instances ()
+import Test.Tasty (defaultMain, testGroup, TestTree)
+import Data.Primitive.Instances
+import Data.Primitive.Types (Prim(..))
+import qualified GHC.Num as Num
+import qualified Test.QuickCheck.Classes as QCC
+
+type Laws = QCC.Laws
+
+main :: IO ()
+main = QCC.lawsCheckMany namedTests
+  where
+    namedTests :: [(String, [Laws])]
+    namedTests =
+      [ ("Complex Double", myLaws pComplex)
+      , ("Ratio Int", myLaws pRatio)
+      , ("Fingerprint", myLaws pRatio)
+      ]
+    myLaws :: (Arbitrary a, Show a, Eq a, Prim a) => Proxy a -> [Laws]
+    myLaws p = [QCC.primLaws p]
+
+p :: forall a. Proxy a; p = Proxy
+
+pComplex     = p @(Complex Double)
+pRatio       = p @(Ratio Int)
+pFingerprint = p @Fingerprint
