diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# vinyl-utils
+Utilities for Vinyl
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,6 +1,10 @@
-0.1.0.1
+0.2.0.0
+-------
 
-* Bumped base to 4.8
+* Updated for base-4.8
+* Added operations on field constraints.
+* Added proxy record generation.
+* Removed ConstApplicative type class, replaced by generation from proxy record.
 
 0.1.0.0
 -------
diff --git a/src/Data/Vinyl/Utils/Compose.hs b/src/Data/Vinyl/Utils/Compose.hs
--- a/src/Data/Vinyl/Utils/Compose.hs
+++ b/src/Data/Vinyl/Utils/Compose.hs
@@ -1,3 +1,12 @@
+{-|
+Module      : Data.Vinyl.Utils.Compose
+Copyright   : (c) Marcin Mrotek, 2014
+License     : BSD3
+Maintainer  : marcin.jan.mrotek@gmail.com
+
+Operations on composed functor records.
+-}
+
 {-# LANGUAGE
       DataKinds
     , PolyKinds
@@ -5,18 +14,9 @@
 
 {-# OPTIONS_HADDOCK show-extensions #-}
 
-{-|
-Module      : Data.Vinyl.Utils.Compose
-Description : Operations on records parametrized with composition of functors.
-Copyright   : (c) Marcin Mrotek, 2014
-License     : BSD3
-Maintainer  : marcin.jan.mrotek@gmail.com
--}
+module Data.Vinyl.Utils.Compose 
+  ( rtraverse1 ) where
 
-module Data.Vinyl.Utils.Compose (
-    rtraverse1
-) where
-import Control.Applicative
 import Data.Vinyl.Functor
 import Data.Vinyl
 
diff --git a/src/Data/Vinyl/Utils/Const.hs b/src/Data/Vinyl/Utils/Const.hs
--- a/src/Data/Vinyl/Utils/Const.hs
+++ b/src/Data/Vinyl/Utils/Const.hs
@@ -1,3 +1,13 @@
+{-|
+Module      : Data.Vinyl.Utils.Const
+Copyright   : (c) Marcin Mrotek, 2014
+License     : BSD3
+Maintainer  : marcin.jan.mrotek@gmail.com
+
+Operations on constant type records.
+-}
+
+
 {-# LANGUAGE
       DataKinds
     , PolyKinds
@@ -7,24 +17,19 @@
 
 {-# OPTIONS_HADDOCK show-extensions #-}
 
-{-|
-Module      : Data.Vinyl.Utils.Const
-Description : Operations on constant type records.
-Copyright   : (c) Marcin Mrotek, 2014
-License     : BSD3
-Maintainer  : marcin.jan.mrotek@gmail.com
--}
-
-module Data.Vinyl.Utils.Const (
-      ConstApplicative(..)
-    , rconst
-    , constCommute
-    , rtraverseconst
-) where
+module Data.Vinyl.Utils.Const
+  ( cfmap
+  , cpure
+  , capp
+  , rconst
+  , constCommute
+  , rtraverseconst
+  , Record (..)
+  ) where
 
 import Data.Vinyl.Utils.Compose
+import Data.Vinyl.Utils.Proxy
 
-import Control.Applicative hiding (Const)
 import Data.Vinyl.Functor
 import Data.Vinyl
 
@@ -33,20 +38,20 @@
 cfmap _ RNil = RNil
 cfmap f (Const r :& rs) = Const (f r) :& cfmap f rs
 
--- |Extension of 'pure' to constant type records.
-class ConstApplicative (rs :: [k]) where
-    cpure :: a -> Rec (Const a) rs
- 
-instance ConstApplicative '[] where
-    cpure = const RNil
+cpure :: Record rs => a -> Rec (Const a) rs
+-- ^Extension of 'pure' to constant type records.
+cpure = cpure' proxyRecord
 
-instance ConstApplicative rs => ConstApplicative (r ': rs) where
-    cpure x = Const x :& cpure x
+cpure' :: Rec Proxy rs -> a -> Rec (Const a) rs
+cpure' RNil _ = RNil
+cpure' (Proxy :& ps) a = Const a :& cpure' ps a
 
 capp  :: (Rec (Const (a -> b)) rs) -> Rec (Const a) rs -> Rec (Const b) rs
 -- ^Extension of (<*>) to constant type records.
 capp RNil RNil = RNil
 capp (Const f :& fs) (Const x :& xs) = Const (f x) :& capp fs xs
+capp RNil _ = error "impossible"
+capp _ RNil = error "impossible"
 
 rconst :: (Applicative f, RecApplicative rs) => f a -> f (Rec (Const a) rs)
 rconst = rtraverse1 . rcpure
@@ -59,3 +64,4 @@
 rtraverseconst :: Applicative f => Rec (Const (f a)) rs -> f (Rec (Const a) rs)
 -- ^Distribute a functor over a constant type record.
 rtraverseconst rec = rtraverse1 $ constCommute <<$>> rec
+
diff --git a/src/Data/Vinyl/Utils/Field.hs b/src/Data/Vinyl/Utils/Field.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Vinyl/Utils/Field.hs
@@ -0,0 +1,44 @@
+{-|
+Module      : Data.Vinyl.Utils.Field
+Copyright   : (c) Marcin Mrotek, 2014
+License     : BSD3
+Maintainer  : marcin.jan.mrotek@gmail.com
+
+Manipulation of constraints that apply to field labels (as opposed to actual types stored in the record).
+-}
+
+{-# LANGUAGE 
+    ConstraintKinds
+  , DataKinds
+  , GADTs
+  , PolyKinds
+  , TypeFamilies
+  , TypeOperators
+  #-}
+
+{-# OPTIONS_HADDOCK show-extensions #-}
+
+module Data.Vinyl.Utils.Field where
+
+import Data.Proxy
+import Data.Vinyl
+import GHC.Exts
+
+-- |Assert that all field labels in a given type list satisfy a given constraint.
+type family FieldAll (rs :: [k]) (c :: k -> Constraint) :: Constraint where
+  FieldAll '[] c = ()
+  FieldAll (r ': rs) c = (c r, FieldAll rs c)
+
+-- |An empty data type that reifies a constraint.
+data DictProxy c a where
+  DictProxy :: c a => DictProxy c a
+
+getProxy :: DictProxy c a -> Proxy a
+-- ^Obtain a 'Proxy' from a 'DictProxy'
+getProxy DictProxy = Proxy
+
+reifyFieldConstraint :: FieldAll rs c => proxy c -> Rec Proxy rs -> Rec (DictProxy c) rs
+-- ^Given a constraint that applies to all field labels and a dummy record, reify the constraint for all field labels.
+reifyFieldConstraint _ RNil = RNil
+reifyFieldConstraint c (Proxy :& ps) = DictProxy :& reifyFieldConstraint c ps
+
diff --git a/src/Data/Vinyl/Utils/Operator.hs b/src/Data/Vinyl/Utils/Operator.hs
--- a/src/Data/Vinyl/Utils/Operator.hs
+++ b/src/Data/Vinyl/Utils/Operator.hs
@@ -1,3 +1,12 @@
+{-|
+Module      : Data.Vinyl.Utils.Operator
+Copyright   : (c) Marcin Mrotek, 2014
+License     : BSD3
+Maintainer  : marcin.jan.mrotek@gmail.com
+
+Operations on records parametrized with various kinds of functions.
+-}
+
 {-# LANGUAGE 
       ConstraintKinds
     , DataKinds
@@ -13,23 +22,12 @@
 
 {-# OPTIONS_HADDOCK show-extensions #-}
 
-{-|
-Module      : Data.Vinyl.Utils.Operator
-Description : Operations on records parametrized with various kinds of functions.
-Copyright   : (c) Marcin Mrotek, 2014
-License     : BSD3
-Maintainer  : marcin.jan.mrotek@gmail.com
--}
-
 module Data.Vinyl.Utils.Operator (
       operator
     , (/$/), (/$$/), (\$\), (\$$\), (\&&\), (\||\)
-    , p
 ) where
 
-import Control.Applicative hiding (Const)
 import Data.Functor.Contravariant
-import Data.Monoid
 import Data.Vinyl
 import Data.Vinyl.Functor
 
@@ -37,6 +35,8 @@
 -- ^Create an operator between records sharing their fields but differing in functors.
 operator _ RNil RNil = RNil
 operator f (a :& as) (b :& bs) = (f a b) :& operator f as bs
+operator _ RNil _ = error "impossible"
+operator _ _ RNil = error "impossible"
 
 (/$/) :: Functor f => Rec ((->) a) rs -> Rec (Const (f a)) rs -> Rec f rs
 -- ^Apply a record of (a -> x) functions to a constant type record to obtain a plain f-record.
@@ -54,6 +54,7 @@
 -- ^Apply a record of (f x -> a) functions to a plain f-record to obtain a constant type record.
 (\$$\) = operator (\(Compose (Op f)) x -> Const $ f x)
 
+predicate :: Functor f => Predicate t -> f t -> Const (f Bool) a
 predicate (Predicate p) x = Const $ p <$> x
 
 (\&&\) :: forall f rs. Applicative f => Rec Predicate rs -> Rec f rs -> f Bool
@@ -75,8 +76,4 @@
         go (Const a :& as) b = go as $ (||) <$> a <*> b
         result :: Rec (Const (f Bool)) rs
         result = operator predicate p r
-
-p :: (a -> Bool) -> Predicate a
--- ^Shorthand for creation of predicates.
-p = Predicate
 
diff --git a/src/Data/Vinyl/Utils/Proxy.hs b/src/Data/Vinyl/Utils/Proxy.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Vinyl/Utils/Proxy.hs
@@ -0,0 +1,41 @@
+{-|
+Module      : Data.Vinyl.Utils.Proxy
+Copyright   : (c) Marcin Mrotek, 2014
+License     : BSD3
+Maintainer  : marcin.jan.mrotek@gmail.com
+
+Create a dummy record parametrized by 'Proxy', for the purpose of guiding code generation through pattern matching.
+-}
+
+{-# LANGUAGE
+    DataKinds
+  , GADTs
+  , RankNTypes
+  , TypeOperators
+  #-}
+
+module Data.Vinyl.Utils.Proxy 
+  ( module Data.Vinyl.Utils.Proxy
+  , Proxy (..)
+  ) where
+
+import Data.Proxy
+import Data.Vinyl
+
+-- |Create a dummy record parametrized by 'Proxy'. The class is named 'Record' to signify that every possible type list is its instance.
+class Record rs where
+  proxyRecord :: Rec Proxy rs
+
+instance Record '[] where
+  proxyRecord = RNil
+
+instance Record rs => Record (r ': rs) where
+  proxyRecord = Proxy :& proxyRecord
+
+recPure :: Record rs => (forall a. f a) -> Rec f rs
+recPure = recPure' proxyRecord
+
+recPure' :: Rec Proxy rs -> (forall a. f a) -> Rec f rs
+recPure' RNil _ = RNil
+recPure' (Proxy :& ps) a = a :& recPure' ps a
+
diff --git a/vinyl-utils.cabal b/vinyl-utils.cabal
--- a/vinyl-utils.cabal
+++ b/vinyl-utils.cabal
@@ -1,34 +1,40 @@
--- Initial vinyl-utils.cabal generated by cabal init.  For further 
--- documentation, see http://haskell.org/cabal/users-guide/
-
 name:                vinyl-utils
-version:             0.1.0.1
+version:             0.2.0.0
 synopsis:            Utilities for vinyl
 description:         Operations on records parametrized with various kinds of functors.
 license:             BSD3
 license-file:        LICENSE
 author:              Marcin Mrotek
 maintainer:          marcin.jan.mrotek@gmail.com
--- copyright:           
+copyright:           (c) Marcin Mrotek 2015
 category:            Control
 build-type:          Simple
--- extra-source-files:  
+extra-source-files:  README.md
 cabal-version:       >=1.10
-homepage:            http://hub.darcs.net/mjm/vinyl-utils
+homepage:            https://github.com/marcinmrotek/vinyl-utils       
 extra-source-files:  changelog.md
 source-repository    head
-    type:    darcs
-    location: mjm@hub.darcs.net:mjm/vinyl-utils
+    type:     git
+    location: https://github.com/marcinmrotek/vinyl-utils 
 
+Flag devel
+    description: Development mode (-Werror).
+    default: False
+    manual:  True
+
 library
   exposed-modules:     Data.Vinyl.Utils.Const
                       ,Data.Vinyl.Utils.Compose
+                      ,Data.Vinyl.Utils.Field
                       ,Data.Vinyl.Utils.Operator
-  -- other-modules:       
-  -- other-extensions:    
-  build-depends:       base >= 4.7 && < 4.9
-                      ,contravariant
-                      ,transformers
-                      ,vinyl >= 0.5
+                      ,Data.Vinyl.Utils.Proxy
+  build-depends:       base          >= 4.8 && < 4.9
+                      ,contravariant >= 1.3 && < 1.4
+                      ,transformers  >= 0.4 && < 0.5
+                      ,vinyl         >= 0.5 && < 0.6
   hs-source-dirs:      src
   default-language:    Haskell2010
+  ghc-options: -Wall 
+  if flag(devel)
+     ghc-options: -Werror
+
