diff --git a/constraint-classes.cabal b/constraint-classes.cabal
--- a/constraint-classes.cabal
+++ b/constraint-classes.cabal
@@ -1,22 +1,40 @@
-name:                constraint-classes
-version:             0.3.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
+name:
+  constraint-classes
+version:
+  0.4.0
+synopsis:
+  Prelude classes using ConstraintKinds
+description:
+  Please see README.md
+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
-  build-depends:       base >= 4.7 && < 5
-  default-language:    Haskell2010
+  hs-source-dirs:
+    src
+  exposed-modules:
+    Control.ConstraintClasses
+  build-depends:
+    base >= 4.7 && < 5
+  default-language:
+    Haskell2010
 
 source-repository head
-  type:     git
-  location: https://github.com/guaraqe/constraint-classes
+  type:
+    git
+  location:
+    https://github.com/guaraqe/constraint-classes
diff --git a/src/Control/ConstraintClasses.hs b/src/Control/ConstraintClasses.hs
--- a/src/Control/ConstraintClasses.hs
+++ b/src/Control/ConstraintClasses.hs
@@ -1,51 +1,114 @@
 {-# LANGUAGE ConstraintKinds #-}
-{-# LANGUAGE TypeFamilies    #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE FunctionalDependencies #-}
 
 module Control.ConstraintClasses
-       ( CFunctor     (..)
-       , CFoldable    (..) ) where
+  ( CFunctor (..)
+  , CApplicative (..)
+  , CMonad (..)
+  , CFoldable (..)
+  , CTraversable (..)
+  , CZippable (..)
+  , CIndexed (..)
+  ) where
 
 import GHC.Exts (Constraint)
 
 ----------------------------------------------------------------------
 
 class CFunctor f where
-  type CFun f a :: Constraint
-  type CFun f a = ()
+  type Con f a :: Constraint
+  type Con f a = ()
 
-  _fmap :: (CFun f a, CFun f b) => (a -> b) -> f a -> f b
+  _fmap :: (Con f a, Con f b) => (a -> b) -> f a -> f b
 
 ----------------------------------------------------------------------
 
-class CFoldable f where
+class CFunctor f => CApplicative f where
 
-  type CFol f a :: Constraint
-  type CFol f a = ()
+  _pure :: (Con f a) => a -> f a
 
-  _foldr  :: (CFol f a) => (a -> b -> b) -> b -> f a -> b
-  _foldr' :: (CFol f a) => (a -> b -> b) -> b -> f a -> b
-  _foldl  :: (CFol f b) => (a -> b -> a) -> a -> f b -> a
-  _foldl' :: (CFol f b) => (a -> b -> a) -> a -> f b -> a
+  _liftA2 ::
+    (Con f a, Con f b, Con f c) =>
+    (a -> b -> c) -> f a -> f b -> f c
 
-  _fold :: (CFol f m, Monoid m) => f m -> m
+  _liftA3 ::
+    (Con f a, Con f b, Con f c, Con f d) =>
+    (a -> b -> c -> d) -> f a -> f b -> f c -> f d
+
+  _liftA4 ::
+    (Con f a, Con f b, Con f c, Con f d, Con f e) =>
+    (a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
+
+----------------------------------------------------------------------
+
+class CApplicative f => CMonad f where
+
+  _concatMap ::
+    (Con f a, Con f b) =>
+    (a -> f b) -> f a -> f b
+
+----------------------------------------------------------------------
+
+class CFoldable f where
+  {-# MINIMAL _foldMap | _foldr #-}
+
+  _foldr  :: (Con f a) => (a -> b -> b) -> b -> f a -> b
+  _foldr' :: (Con f a) => (a -> b -> b) -> b -> f a -> b
+  _foldl  :: (Con f b) => (a -> b -> a) -> a -> f b -> a
+  _foldl' :: (Con f b) => (a -> b -> a) -> a -> f b -> a
+
+  _fold :: (Con f m, Monoid m) => f m -> m
   _fold = _foldMap id
 
-  _foldMap :: (CFol f a, CFol f m, Monoid m) => (a -> m) -> f a -> m
+  _foldMap :: (Con f a, Con f m, Monoid m) => (a -> m) -> f a -> m
   _foldMap f = _foldr (mappend . f) mempty
+  {-# INLINE _foldMap #-}
 
-  _length :: CFol f a => f a -> Int
+  _length :: Con f a => f a -> Int
   _length = _foldl (\c _ -> c+1) 0
 
-  _mapM :: (Monad m, CFol f a, CFol f b)
+  _mapM :: (Monad m, Con f a, Con f b)
         => (a -> m b) -> f a -> m (f b)
 
-  _forM :: (Monad m, CFol f a, CFol f b)
+  _forM :: (Monad m, Con f a, Con f b)
         => f a -> (a -> m b) -> m (f b)
   _forM = flip _mapM
 
-  _mapM_ :: (Monad m, CFol f a)
+  _mapM_ :: (Monad m, Con f a)
          => (a -> m b) -> f a -> m ()
 
-  _forM_ :: (Monad m, CFol f a)
+  _forM_ :: (Monad m, Con f a)
          => f a -> (a -> m b) -> m ()
   _forM_ = flip _mapM_
+
+----------------------------------------------------------------------
+
+class (CFunctor t, CFoldable t) => CTraversable t where
+
+  _traverse ::
+    (Con t a, Con t b, Monad f) =>
+    (a -> f b) -> t a -> f (t b)
+
+----------------------------------------------------------------------
+
+class CFunctor f => CZippable f where
+
+  _zipWith ::
+    (Con f a, Con f b, Con f c) =>
+    (a -> b -> c) -> f a -> f b -> f c
+
+  _zipWith3 ::
+    (Con f a, Con f b, Con f c, Con f d) =>
+    (a -> b -> c -> d) -> f a -> f b -> f c -> f d
+
+  _zipWith4 ::
+    (Con f a, Con f b, Con f c, Con f d, Con f e) =>
+    (a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
+
+----------------------------------------------------------------------
+
+class CFunctor f => CIndexed f i | f -> i where
+
+  (!) :: (Con f a) => f a -> i -> a
