diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright guaraqe (c) 2016
+
+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 guaraqe 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/constraint-classes.cabal b/constraint-classes.cabal
new file mode 100644
--- /dev/null
+++ b/constraint-classes.cabal
@@ -0,0 +1,23 @@
+name:                constraint-classes
+version:             0.1.0
+synopsis:            Prelude classes using ConstraintKinds
+description:         Please see README.org
+homepage:            http://github.com/guaraqe/constraint-classes#readme
+license:             BSD3
+license-file:        LICENSE
+author:              guaraqe
+maintainer:          guaraqe@openmailbox.org
+copyright:           2016 guaraqe
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Control.ConstraintClasses
+                     , Control.ConstraintClasses.Extras
+  build-depends:       base >= 4.7 && < 5
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/guaraqe/constraint-classes
diff --git a/src/Control/ConstraintClasses.hs b/src/Control/ConstraintClasses.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/ConstraintClasses.hs
@@ -0,0 +1,51 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE TypeFamilies    #-}
+
+module Control.ConstraintClasses
+       ( CFunctor     (..)
+       , CFoldable    (..) ) where
+
+import GHC.Exts (Constraint)
+
+----------------------------------------------------------------------
+
+class CFunctor f where
+  type CFun f a :: Constraint
+  type CFun f a = ()
+
+  cmap :: (CFun f a, CFun f b) => (a -> b) -> f a -> f b
+
+----------------------------------------------------------------------
+
+class CFoldable f where
+
+  type CFol f a :: Constraint
+  type CFol f a = ()
+
+  cfoldr  :: (CFol f a) => (a -> b -> b) -> b -> f a -> b
+  cfoldr' :: (CFol f a) => (a -> b -> b) -> b -> f a -> b
+  cfoldl  :: (CFol f b) => (a -> b -> a) -> a -> f b -> a
+  cfoldl' :: (CFol f b) => (a -> b -> a) -> a -> f b -> a
+
+  cfold :: (CFol f m, Monoid m) => f m -> m
+  cfold = cfoldMap id
+
+  cfoldMap :: (CFol f a, CFol f m, Monoid m) => (a -> m) -> f a -> m
+  cfoldMap f = cfoldr (mappend . f) mempty
+
+  clength :: CFol f a => f a -> Int
+  clength = cfoldl (\c _ -> c+1) 0
+
+  cmapM :: (Monad m, CFol f a, CFol f b)
+        => (a -> m b) -> f a -> m (f b)
+
+  cforM :: (Monad m, CFol f a, CFol f b)
+        => f a -> (a -> m b) -> m (f b)
+  cforM = flip cmapM
+
+  cmapM_ :: (Monad m, CFol f a)
+         => (a -> m b) -> f a -> m ()
+
+  cforM_ :: (Monad m, CFol f a)
+         => f a -> (a -> m b) -> m ()
+  cforM_ = flip cmapM_
diff --git a/src/Control/ConstraintClasses/Extras.hs b/src/Control/ConstraintClasses/Extras.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/ConstraintClasses/Extras.hs
@@ -0,0 +1,28 @@
+module Control.ConstraintClasses.Extras
+       ( CZippable (..) ) where
+
+import Control.ConstraintClasses
+
+class CFunctor f => CZippable f where
+  czip :: (CFun f a, CFun f b, CFun f (a,b))
+       => f a -> f b -> f (a,b)
+
+  czipWith :: ( CFun f a
+              , CFun f b
+              , CFun f (a,b)
+              , CFun f c)
+          => (a -> b -> c) -> f a -> f b -> f c
+  czipWith f x y = cmap (uncurry f) (czip x y)
+
+  czipWith3 :: ( CFun f a
+               , CFun f b
+               , CFun f c
+               , CFun f (a,b)
+               , CFun f ((a,b),c)
+               , CFun f d )
+            => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
+  czipWith3 f x y z = cmap ((uncurry . uncurry) f)
+                           (czip (czip x y) z)
+
+  czipWith4 :: (CFun f a, CFun f b, CFun f c, CFun f d, CFun f e)
+            => (a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
