diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+0.3.1:
+	* Add Subset class.
+
 0.3.0:
 	* Put labels in its own class.
 	* Change type of labels to take a Proxy.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -5,8 +5,7 @@
 This package is experimental, exploring the design space opened up by
 the implemented and to-be-implemented work on extensible records in GHC.
 
-*Note: You need GHC 8.0.1 for the `#foo` syntax, otherwise you have to
- use `$("foo")` which works on GHC 7.10.*
+*Note: You need GHC 8.0.1.*
 
 ## Basic examples
 
diff --git a/labels.cabal b/labels.cabal
--- a/labels.cabal
+++ b/labels.cabal
@@ -1,5 +1,5 @@
 name:                labels
-version:             0.3.0
+version:             0.3.1
 synopsis:            Anonymous records via named tuples
 description:         Declare and access tuple fields with labels. An approach to anonymous records.
 homepage:            https://github.com/chrisdone/labels#readme
diff --git a/src/Labels.hs b/src/Labels.hs
--- a/src/Labels.hs
+++ b/src/Labels.hs
@@ -75,6 +75,7 @@
 --
 -- >>> reflect @Show show (#bar := "hello", #foo := 3, #mu := "hi")
 -- [("bar","\"hello\""),("foo","3"),("mu","\"hi\"")]
+--
 
 module Labels
 -- Field access
@@ -91,7 +92,8 @@
   , Has
   , Cons
   , Project
-  , Reflect)
+  , Reflect
+  , Subset)
   where
 
 import Data.Proxy
diff --git a/src/Labels/Internal.hs b/src/Labels/Internal.hs
--- a/src/Labels/Internal.hs
+++ b/src/Labels/Internal.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE UndecidableInstances #-}
 {-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE Rank2Types #-}
@@ -20,7 +21,7 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE OverloadedLabels #-}
 
-{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-orphans -Wno-redundant-constraints #-}
 
 -- | This module provides a way to name the fields in a regular
 -- Haskell tuple and then look them up later, statically.
@@ -108,6 +109,11 @@
   project :: from -> to
 
 --------------------------------------------------------------------------------
+-- Subset
+
+class Subset sub super
+
+--------------------------------------------------------------------------------
 -- Key-value reflection
 
 -- | Reflection on labelled fields.
@@ -311,5 +317,24 @@
              ]
          , return (PragmaD (InlineP 'project Inline FunLike AllPhases))
          ]
+       | n <- [1 .. 24]
+       ])
+
+-- Generate Subset instances.
+$(let labelt i = varT (mkName ("l" ++ show i))
+      typ i = varT (mkName ("t" ++ show i))
+      typ' i = varT (mkName ("t'" ++ show i))
+      r = varT (mkName "r")
+  in sequence
+       [ instanceD
+         (sequence
+            ([ [t|Has ($(labelt i) :: Symbol) $(typ i) $(r)|]
+             | i <- [1 :: Int .. n]
+             ]))
+         [t|Subset $(foldl
+                       appT
+                       (tupleT n)
+                       [[t|$(labelt i) := $(typ' i)|] | i <- [1 .. n]]) $(r)|]
+         []
        | n <- [1 .. 24]
        ])
