diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+20 Feb 2014
+	Release 0.3.4
+	RecordPuns add ( ) syntax
+	Use the tagged package: this removes LVPair and lowercase proxy.
+
 03 Feb 2014
     Release 0.3.2.0
 	Relax hspec dependency
diff --git a/Data/HList/Data.hs b/Data/HList/Data.hs
--- a/Data/HList/Data.hs
+++ b/Data/HList/Data.hs
@@ -181,7 +181,7 @@
 instance RecordLabelsStr '[] where
     recordLabelsStr _ = []
 instance (RecordLabelsStr xs,
-          ShowLabel x) => RecordLabelsStr (LVPair x t ': xs) where
+          ShowLabel x) => RecordLabelsStr (Tagged x t ': xs) where
     recordLabelsStr _ = showLabel (undefined :: Label x) :
                             recordLabelsStr (undefined :: Record xs)
 
@@ -216,7 +216,7 @@
 deriving instance Typeable Record
 deriving instance Typeable HList
 deriving instance Typeable HListFlat
-deriving instance Typeable LVPair
+-- deriving instance Typeable Tagged
 
 type TypeablePolyK (a :: k) = (Typeable a)
 #else
@@ -228,12 +228,12 @@
   typeOf x = mkTyConApp (mkTyCon3 "HList" "Data.HList.Record" "Record")
                 [ tyConList (typeRepsList x) ]
 
-instance ShowLabel sy => Typeable1 (LVPair sy) where
+instance ShowLabel sy => Typeable1 (Tagged sy) where
   typeOf1 _ = mkTyConApp
         (mkTyCon3 "HList" "Data.HList.Data" (showLabel (undefined :: Label sy)))
         []
 
-instance (ShowLabel sy, Typeable x) => Typeable (LVPair sy x) where
+instance (ShowLabel sy, Typeable x) => Typeable (Tagged sy x) where
   typeOf _ = mkTyConApp
             (mkTyCon3 "GHC" "GHC.TypeLits" (showLabel (undefined :: Label sy)))
             [mkTyConApp (mkTyCon3 "HList" "Data.HList.Record" "=") [],
diff --git a/Data/HList/FakePrelude.hs b/Data/HList/FakePrelude.hs
--- a/Data/HList/FakePrelude.hs
+++ b/Data/HList/FakePrelude.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE OverlappingInstances #-}
+-- just for the proxy
 
 {- |
    The HList library
@@ -9,11 +11,11 @@
 
 module Data.HList.FakePrelude
     (module Data.HList.FakePrelude,
-     module Data.HList.FakePrelude.Proxy) where
+     module Data.Proxy) where
 
+import Data.Proxy
 import GHC.Prim (Constraint)
 import GHC.TypeLits
-import Data.HList.FakePrelude.Proxy
 
 -- --------------------------------------------------------------------------
 -- * A heterogeneous apply operator
diff --git a/Data/HList/FakePrelude/Proxy.hs b/Data/HList/FakePrelude/Proxy.hs
deleted file mode 100644
--- a/Data/HList/FakePrelude/Proxy.hs
+++ /dev/null
@@ -1,23 +0,0 @@
-{-# LANGUAGE CPP #-}
-
-{- | Injection from algebraic kinds to *
-
-Algebraic kinds like Nat are not populated and we can't use 
-values of type Nat as function arguments. In contrast, we can use
-(undefined :: Proxy Z) as an argument, as a value proxy.
-data Proxy (tp :: k) :: *
-
-re-exports 'Data.Typeable.Proxy' if it exists
--}
-module Data.HList.FakePrelude.Proxy (Proxy, proxy) where
-
-#if MIN_VERSION_base(4,7,0)
-import Data.Typeable (Proxy(..))
-#else
-
-data Proxy tp 
-#endif
-
-proxy :: Proxy tp
-proxy =  undefined
-
diff --git a/Data/HList/HList.hs b/Data/HList/HList.hs
--- a/Data/HList/HList.hs
+++ b/Data/HList/HList.hs
@@ -96,7 +96,7 @@
 hTail (HCons _ l) = l
 
 -- | Length
-type family HLength (x :: [*]) :: HNat
+type family HLength (x :: [k]) :: HNat
 type instance HLength '[] = HZero
 type instance HLength (x ': xs) = HSucc (HLength xs)
 
@@ -109,10 +109,10 @@
   (.*.) = HCons
 
 instance HAppend (HList l1) (HList l2) where
-  type HAppendR (HList l1) (HList l2) = HList (HAppendList l1 l2)
   hAppend = hAppendList
+type instance HAppendR (HList l1) (HList l2) = HList (HAppendList l1 l2)
 
-type family HAppendList (l1 :: [*]) (l2 :: [*]) :: [*]
+type family HAppendList (l1 :: [k]) (l2 :: [k]) :: [k]
 type instance HAppendList '[] l = l
 type instance HAppendList (e ': l) l' = e ': HAppendList l l'
 
@@ -171,7 +171,7 @@
 -- * Reversing HLists
 
 -- Append the reversed l1 to l2
-type family HRevApp (l1 :: [*]) (l2 :: [*]) :: [*]
+type family HRevApp (l1 :: [k]) (l2 :: [k]) :: [k]
 type instance HRevApp '[] l = l
 type instance HRevApp (e ': l) l' = HRevApp l (e ': l')
 
@@ -352,18 +352,22 @@
 
 -- * replicate
 
-class HReplicate (n :: HNat) e where
-    type HReplicateR n e :: [*]
+class (HLength (HReplicateR n e) ~ n) =>
+      HReplicate (n :: HNat) e where
     hReplicate :: Proxy n -> e -> HList (HReplicateR n e)
 
 instance HReplicate HZero e where
-    type HReplicateR HZero e = '[]
     hReplicate _ _ = HNil
 
 instance HReplicate n e => HReplicate (HSucc n) e where
-    type HReplicateR (HSucc n) e = e ': HReplicateR n e
     hReplicate n e = e `HCons` hReplicate (hPred n) e
 
+-- | would be associated with 'HReplicate' except we want
+-- it to work with `e` of any kind, not just `*` that you can
+-- put into a HList. An \"inverse\" of 'HLength'
+type family HReplicateR (n :: HNat) (e :: k) :: [k]
+type instance HReplicateR HZero e = '[]
+type instance HReplicateR (HSucc n) e = e ': HReplicateR n e
 
 -- * concat
 
@@ -467,27 +471,37 @@
     applyAB (HMap f) = hMapAux f
 
 type HMapCxt f as bs as' bs' = (HMapAux f as' bs', as ~ HList as', bs ~ HList bs',
-    SameLength as' bs', SameLength bs' as')
+    SameLength as' bs')
 
 
 -- | Ensure two lists have the same length. We do case analysis on the
 -- first one (hence the type must be known to the type checker).
 -- In contrast, the second list may be a type variable.
-class SameLength es1 es2
-instance (es2 ~ '[]) => SameLength '[] es2
-instance (SameLength xs ys, es2 ~ (y ': ys)) => SameLength (x ': xs) es2
+class SameLength' (es1 :: [k]) (es2 :: [m])
+instance (es2 ~ '[]) => SameLength' '[] es2
+instance (SameLength' xs ys, es2 ~ (y ': ys)) => SameLength' (x ': xs) es2
 
+{- | symmetrical version of 'SameLength''. Written as a class instead of
 
+ > type SameLength a b = (SameLength' a b, SameLength' b a)
 
+since ghc expands type synonyms, but not classes (and it seems to have the same
+result)
 
+-}
+class (SameLength' x y, SameLength' y x) =>
+        SameLength (x :: [k]) (y :: [m])
+instance (SameLength' x y, SameLength' y x) => SameLength x y
+
+
+
 class HMapAux f (l :: [*]) (r :: [*]) where
-  hMapAux :: (SameLength l r, SameLength r l) => f -> HList l -> HList r
+  hMapAux :: SameLength l r => f -> HList l -> HList r
 
 instance HMapAux f '[] '[] where
   hMapAux       _  _  = HNil
 
-instance (ApplyAB f e e', HMapAux f l l',
-    SameLength l l', SameLength l' l)
+instance (ApplyAB f e e', HMapAux f l l', SameLength l l')
     => HMapAux f (e ': l) (e' ': l') where
   hMapAux f (HCons x l)    = applyAB f x `HCons` hMapAux f l
 
@@ -551,7 +565,7 @@
    <http://www.haskell.org/pipermail/haskell-cafe/2006-October/018784.html>
  -}
 
-class (Applicative m, SameLength a b, SameLength b a) => HSequence m a b | a -> b, m b -> a where
+class (Applicative m, SameLength a b) => HSequence m a b | a -> b, m b -> a where
     hSequence :: HList a -> m (HList b)
 {- ^
 
@@ -814,7 +828,7 @@
       =>  HTMember e (e' ': l) b''
 
 hTMember :: HTMember e l b => e -> HList l -> Proxy b
-hTMember _ _ = proxy
+hTMember _ _ = Proxy
 
 
 -- * Intersection based on HTMember
diff --git a/Data/HList/HListPrelude.hs b/Data/HList/HListPrelude.hs
--- a/Data/HList/HListPrelude.hs
+++ b/Data/HList/HListPrelude.hs
@@ -24,11 +24,12 @@
 -- subType :: SubType l l' => l -> l' -> ()
 -- subType _ _ = ()
 
--- poly-kinded
 class HAppend l1 l2 where
-  type HAppendR l1 l2
   hAppend :: l1 -> l2 -> HAppendR l1 l2
 
+-- | poly-kinded, but 'hAppend' only works in cases where the kind variable
+-- `k` is `*`
+type family HAppendR (l1::k) (l2::k) :: k
 -- class HMember e1 l (b :: Bool) | e1 l -> b
 
 -- One occurrence and nothing is left
diff --git a/Data/HList/Keyword.hs b/Data/HList/Keyword.hs
--- a/Data/HList/Keyword.hs
+++ b/Data/HList/Keyword.hs
@@ -66,7 +66,6 @@
 import Data.HList.HListPrelude
 import Data.HList.HList
 import Data.HList.Record
-import Data.HList.RecordPuns
 
 {- $setup
 
@@ -368,7 +367,7 @@
 instance (HEq kw kw' flag,
 	  KWApply' flag (kw ->a->f') (kw' ': a' ': tail) r)
     => KWApply (kw ->a->f') (kw' ': a' ': tail) r where
-    kwapply = kwapply' (proxy :: Proxy flag)
+    kwapply = kwapply' (Proxy :: Proxy flag)
 
 class KWApply' flag f arg_values r  where
     kwapply':: Proxy flag -> f -> HList arg_values -> r
@@ -429,7 +428,7 @@
 instance (IsKeyFN r rflag,
 	    KW' rflag f arg_desc arg_def r)
     => KW f arg_desc arg_def r where
-    kwdo = kw' (proxy ::Proxy rflag)
+    kwdo = kw' (Proxy ::Proxy rflag)
 
 class KW' rflag f arg_desc arg_def r where
     kw' :: Proxy rflag -> f -> arg_desc -> HList arg_def -> r
@@ -479,7 +478,7 @@
 instance (HEq kw kw' flag,
 	  KWMerge'' flag kw (kw' ': etc) atail arg_values arg_def f r)
     => KWMerge' kw (kw' ': etc) atail arg_values arg_def f r where
-    kwmerge' = kwmerge'' (undefined:: Proxy flag)
+    kwmerge' = kwmerge'' (Proxy :: Proxy flag)
 
 class KWMerge'' (flag :: Bool) kw (list :: [*]) atail arg_values arg_def f r
      where
@@ -557,10 +556,10 @@
     kw (HCons f arg_def) = kwdo f rfk arg_def :: r
         where rfk = reflect_fk f :: akws
 
-data LVPairToKW = LVPairToKW
-instance (x ~ LVPair l v, y ~ HList '[Label l, v]) =>
-        ApplyAB LVPairToKW x y where
-    applyAB _ (LVPair v) = hBuild Label v
+data TaggedToKW = TaggedToKW
+instance (x ~ Tagged l v, y ~ HList '[Label l, v]) =>
+        ApplyAB TaggedToKW x y where
+    applyAB _ (Tagged v) = hBuild Label v
 
 
 {- | convert a 'Record' into a list that can supply
@@ -569,6 +568,7 @@
 A bit of setup:
 
 >>> :set -XQuasiQuotes
+>>> import Data.HList.RecordPuns
 >>> let f (_ :: Label "a") a (_ :: Label "b") b () = a `div` b
 
 
@@ -581,10 +581,10 @@
 
 
 -}
-recToKW :: forall a b. (HMapAux LVPairToKW a b, SameLength a b,
+recToKW :: forall a b. (HMapAux TaggedToKW a b, SameLength a b,
       SameLength b a, HConcat b) =>
      Record a -> HList (HConcatR b)
-recToKW (Record r) = hConcat (hMap LVPairToKW r :: HList b)
+recToKW (Record r) = hConcat (hMap TaggedToKW r :: HList b)
 
 {- $originalIntro
 
diff --git a/Data/HList/Labelable.hs b/Data/HList/Labelable.hs
--- a/Data/HList/Labelable.hs
+++ b/Data/HList/Labelable.hs
@@ -82,8 +82,8 @@
           HasField x (Record t) b,
           HFind x (RecordLabels t) n,
           HFind x (RecordLabels s) n,
-          HUpdateAtHNat n (LVPair x b) s,
-          t ~ HUpdateAtHNatR n (LVPair x b) s)
+          HUpdateAtHNat n (Tagged x b) s,
+          t ~ HUpdateAtHNatR n (Tagged x b) s)
         => Labelable x (->) f s t a b where
             hLens' lab f rec = fmap (\v -> hUpdateAtLabel lab v rec) (f (rec .!. lab))
 
diff --git a/Data/HList/Record.hs b/Data/HList/Record.hs
--- a/Data/HList/Record.hs
+++ b/Data/HList/Record.hs
@@ -34,9 +34,7 @@
 
     -- ** Labels
     -- $labels
-    LVPair(..),
-    labelLVPair,
-    newLVPair,
+    module Data.Tagged,
     (.=.), (.-.),
 
     -- ** Record
@@ -129,7 +127,9 @@
     HRLabelSet',
     HRearrange(hRearrange2),
     HRearrange'(hRearrange2'),
-    UnionSymRec'(..)
+    UnionSymRec'(..),
+    labelLVPair,
+    newLVPair,
 ) where
 
 
@@ -137,6 +137,8 @@
 import Data.HList.HListPrelude
 import Data.HList.HList
 import Data.HList.HArray
+
+import Data.Tagged
  
 -- imports for doctest/examples
 import Data.HList.Label6 ()
@@ -157,21 +159,16 @@
 -- its value, and the record, at run-time, is indistinguishable from
 -- the HList of field values. At run-time, all information about the
 -- labels is erased.
-
--- | Field of label l with value type v
--- Polykinded with respect to l: label may be a symbol, a nat, etc.
-newtype LVPair l v = LVPair { valueLVPair :: v } deriving Eq
+--
+-- The type from "Data.Tagged" is used.
 
 -- | Label accessor
-labelLVPair :: LVPair l v -> Label l
-labelLVPair = undefined
+labelLVPair :: Tagged l v -> Label l
+labelLVPair _ = Label
 
-newLVPair :: Label l -> v -> LVPair l v
-newLVPair _ = LVPair
+newLVPair :: Label l -> v -> Tagged l v
+newLVPair _ = Tagged
 
--- stolen by typeable
---infixr 4 :=:
---type l :=: v = LVPair l v
 
 
 infixr 4 .=.
@@ -186,7 +183,7 @@
   Record{x="v1",y='2'}
 
 -}
-(.=.) :: Label l -> v -> LVPair l v
+(.=.) :: Label l -> v -> Tagged l v
 l .=. v = newLVPair l v
 
 
@@ -212,11 +209,11 @@
 instance HRLabelSet '[x]
 instance ( HEq l1 l2 leq
          , HRLabelSet' l1 l2 leq r
-         ) => HRLabelSet (LVPair l1 v1 ': LVPair l2 v2 ': r)
+         ) => HRLabelSet (Tagged l1 v1 ': Tagged l2 v2 ': r)
 
 class HRLabelSet' l1 l2 (leq::Bool) (r :: [*])
-instance ( HRLabelSet (LVPair l2 () ': r)
-         , HRLabelSet (LVPair l1 () ': r)
+instance ( HRLabelSet (Tagged l2 () ': r)
+         , HRLabelSet (Tagged l1 () ': r)
          ) => HRLabelSet' l1 l2 False r
 instance ( Fail (DuplicatedLabel l1) ) => HRLabelSet' l1 l2 True r
 
@@ -244,10 +241,10 @@
 
 type family RecordLabels (r :: [*]) :: [k]
 type instance RecordLabels '[]               = '[]
-type instance RecordLabels (LVPair l v ': r) = l ': RecordLabels r
+type instance RecordLabels (Tagged l v ': r) = l ': RecordLabels r
 
 recordLabels :: Record r -> Proxy (RecordLabels r)
-recordLabels = undefined
+recordLabels _ = Proxy
 
 
 -- | Construct the HList of values of the record.
@@ -258,9 +255,9 @@
 instance RecordValues '[] where
   type RecordValuesR '[] = '[]
   recordValues' _ = HNil
-instance RecordValues r=> RecordValues (LVPair l v ': r) where
-   type RecordValuesR (LVPair l v ': r) = v ': RecordValuesR r
-   recordValues' (HCons (LVPair v) r) = HCons v (recordValues' r)
+instance RecordValues r=> RecordValues (Tagged l v ': r) where
+   type RecordValuesR (Tagged l v ': r) = v ': RecordValuesR r
+   recordValues' (HCons (Tagged v) r) = HCons v (recordValues' r)
 
 recordValues :: RecordValues r => Record r -> HList (RecordValuesR r)
 recordValues (Record r) = recordValues' r
@@ -272,7 +269,7 @@
 type instance LabelsOf (Label l ': r)  = l ': LabelsOf r
 
 hLabels :: HList l -> Proxy (LabelsOf l)
-hLabels = undefined
+hLabels _ = Proxy
 
 -- --------------------------------------------------------------------------
 
@@ -293,8 +290,8 @@
          , Show v
          , ShowComponents r
          )
-      =>   ShowComponents (LVPair l v ': r) where
-  showComponents comma (HCons f@(LVPair v) r)
+      =>   ShowComponents (Tagged l v ': r) where
+  showComponents comma (HCons f@(Tagged v) r)
      =  comma
      ++ showLabel ((labelLVPair f) :: Label l)
      ++ "="
@@ -308,9 +305,9 @@
 
 -- Extension
 
-instance HRLabelSet (LVPair l v ': r) 
-    => HExtend (LVPair (l :: k) v) (Record r) where
-  type HExtendR (LVPair l v) (Record r) = Record (LVPair l v ': r)
+instance HRLabelSet (Tagged l v ': r) 
+    => HExtend (Tagged (l :: k) v) (Record r) where
+  type HExtendR (Tagged l v) (Record r) = Record (Tagged l v ': r)
   f .*. (Record r) = mkRecord (HCons f r)
 
 
@@ -333,9 +330,9 @@
 
 instance (HRLabelSet (HAppendList r1 r2), HAppend (HList r1) (HList r2))
     => HAppend (Record r1) (Record r2) where
-  type HAppendR (Record r1) (Record r2) = Record (HAppendList r1 r2)
   hAppend (Record r) (Record r') = mkRecord (hAppend r r')
 
+type instance HAppendR (Record r1) (Record r2) = Record (HAppendList r1 r2)
 -- --------------------------------------------------------------------------
 
 -- Lookup
@@ -364,17 +361,17 @@
 
 
 
-instance (HEq l l1 b, HasField' b l (LVPair l1 v1 ': r) v)
-    => HasField l (Record (LVPair l1 v1 ': r)) v where
+instance (HEq l l1 b, HasField' b l (Tagged l1 v1 ': r) v)
+    => HasField l (Record (Tagged l1 v1 ': r)) v where
     hLookupByLabel l (Record r) =
-             hLookupByLabel' (undefined::Proxy b) l r
+             hLookupByLabel' (Proxy::Proxy b) l r
 
 
 class HasField' (b::Bool) (l :: k) (r::[*]) v | b l r -> v where
     hLookupByLabel':: Proxy b -> Label l -> HList r -> v
 
-instance HasField' True l (LVPair l v ': r) v where
-    hLookupByLabel' _ _ (HCons (LVPair v) _) = v
+instance HasField' True l (Tagged l v ': r) v where
+    hLookupByLabel' _ _ (HCons (Tagged v) _) = v
 instance HasField l (Record r) v => HasField' False l (fld ': r) v where
     hLookupByLabel' _ l (HCons _ r) = hLookupByLabel l (Record r)
 
@@ -424,7 +421,7 @@
    (H2ProjectByLabels '[l] t t1 t2) =>
    Label l -> Record t -> Record t2
 hDeleteAtLabel _ (Record r) = 
-  Record $ snd $ h2projectByLabels (undefined::Proxy '[l]) r
+  Record $ snd $ h2projectByLabels (Proxy::Proxy '[l]) r
 
 infixl 2 .-.
 {-|
@@ -460,10 +457,10 @@
 
 -- | 'hUpdateAtLabel' @label value record@
 hUpdateAtLabel :: forall (r :: [*]) (l :: k) (n::HNat) (v :: *). 
-  (HFind l (RecordLabels r) n, HUpdateAtHNat n (LVPair l v) r) =>
-  Label l -> v -> Record r -> Record (HUpdateAtHNatR n (LVPair l v) r)
+  (HFind l (RecordLabels r) n, HUpdateAtHNat n (Tagged l v) r) =>
+  Label l -> v -> Record r -> Record (HUpdateAtHNatR n (Tagged l v) r)
 hUpdateAtLabel l v (Record r) = 
-    Record (hUpdateAtHNat (undefined::Proxy n) (newLVPair l v) r)
+    Record (hUpdateAtHNat (Proxy::Proxy n) (newLVPair l v) r)
 
 infixr 2 .@.
 {-|
@@ -476,7 +473,7 @@
   > label1 .=. value1 .@. record1
 
 -}
-f@(LVPair v) .@. r  =  hUpdateAtLabel (labelLVPair f) v r
+f@(Tagged v) .@. r  =  hUpdateAtLabel (labelLVPair f) v r
 
 
 -- --------------------------------------------------------------------------
@@ -514,9 +511,9 @@
     h2projectByLabels _ _ = (HNil,HNil)
 
 instance (HMemberM l1 ((l::k) ': ls) (b :: Maybe [k]),
-          H2ProjectByLabels' b (l ': ls) (LVPair l1 v1 ': r1) rin rout)
-    => H2ProjectByLabels (l ': ls) (LVPair l1 v1 ': r1) rin rout where
-    h2projectByLabels = h2projectByLabels' (undefined::(Proxy b))
+          H2ProjectByLabels' b (l ': ls) (Tagged l1 v1 ': r1) rin rout)
+    => H2ProjectByLabels (l ': ls) (Tagged l1 v1 ': r1) rin rout where
+    h2projectByLabels = h2projectByLabels' (Proxy::Proxy b)
 
 class H2ProjectByLabels' (b::Maybe [k]) (ls::[k]) r rin rout 
                          | b ls r -> rin rout where
@@ -526,7 +523,7 @@
 instance H2ProjectByLabels ls1 r rin rout =>
     H2ProjectByLabels' ('Just ls1) ls (f ': r) (f ': rin) rout where
     h2projectByLabels' _ _ (HCons x r) = (HCons x rin, rout)
-        where (rin,rout) = h2projectByLabels (undefined::Proxy ls1) r
+        where (rin,rout) = h2projectByLabels (Proxy::Proxy ls1) r
 
 instance H2ProjectByLabels ls r rin rout =>
     H2ProjectByLabels' 'Nothing ls (f ': r) rin (f ': rout) where
@@ -572,7 +569,7 @@
   The same as '.@.', except type preserving. It has the same fixity as (.\@.).
 
 -}
-f@(LVPair v) .<. r = hTPupdateAtLabel (labelLVPair f) v r
+f@(Tagged v) .<. r = hTPupdateAtLabel (labelLVPair f) v r
 
 -- --------------------------------------------------------------------------
 -- | Subtyping for records
@@ -593,14 +590,14 @@
 
 instance ( RecordLabels r ~ ls
          , HMember l ls b
-         , HLeftUnionBool b r (LVPair l v) r'''
+         , HLeftUnionBool b r (Tagged l v) r'''
          , HLeftUnion r''' r' r''
          )
-           => HLeftUnion r (LVPair l v ': r') r''
+           => HLeftUnion r (Tagged l v ': r') r''
   where
    hLeftUnion r (Record (HCons f r')) = r''
     where
-     r'''    = hLeftUnionBool (proxy :: Proxy b) r f
+     r'''    = hLeftUnionBool (Proxy :: Proxy b) r f
      r''     = hLeftUnion (r''' :: Record r''') (Record r' :: Record r')
 
 class  HLeftUnionBool (b :: Bool) r f r' | b r f -> r'
@@ -659,12 +656,12 @@
 
 instance ( RecordLabels r1 ~ ls
          , HMember l ls b
-         , UnionSymRec' b r1 (LVPair l v) r2' ru
+         , UnionSymRec' b r1 (Tagged l v) r2' ru
          )
-    => UnionSymRec r1 (LVPair l v ': r2') ru
+    => UnionSymRec r1 (Tagged l v ': r2') ru
     where
     unionSR r1 (Record (HCons f r2')) =
-        unionSR' (undefined::Proxy b) r1 f (Record r2')
+        unionSR' (Proxy::Proxy b) r1 f (Record r2')
 
 class UnionSymRec' (b :: Bool) r1 f2 r2' ru | b r1 f2 r2' -> ru where
     unionSR' :: Proxy b -> Record r1 -> f2 -> Record r2'  -> (Record ru, Record ru)
@@ -680,15 +677,15 @@
 -}
 instance (UnionSymRec r1 r2' ru,
           HasField l2 (Record ru) v2,
-          HUpdateAtHNat n (LVPair l2 v2) ru,
-          ru ~ HUpdateAtHNatR n (LVPair l2 v2) ru,
+          HUpdateAtHNat n (Tagged l2 v2) ru,
+          ru ~ HUpdateAtHNatR n (Tagged l2 v2) ru,
           RecordLabels ru ~ ls,
-          f2 ~ LVPair l2 v2,
+          f2 ~ Tagged l2 v2,
           HFind l2 ls n)
     => UnionSymRec' True r1 f2 r2' ru where
-    unionSR' _ r1 (LVPair v2) r2' =
+    unionSR' _ r1 (Tagged v2) r2' =
        case unionSR r1 r2'
-        of (ul,ur) -> (ul, hTPupdateAtLabel (undefined:: Label l2) v2 ur)
+        of (ul,ur) -> (ul, hTPupdateAtLabel (Label :: Label l2) v2 ur)
 
 
 instance (UnionSymRec r1 r2' ru,
@@ -718,8 +715,8 @@
           HRearrange' l ls rin rout (HList r'),
           r'' ~ HList r') =>
         HRearrange (l ': ls) r r'' where
-   hRearrange2 _ r = hRearrange2' (proxy :: Proxy l) (proxy :: Proxy ls) rin rout
-      where (rin, rout) = h2projectByLabels (proxy :: Proxy '[l]) r
+   hRearrange2 _ r = hRearrange2' (Proxy :: Proxy l) (Proxy :: Proxy ls) rin rout
+      where (rin, rout) = h2projectByLabels (Proxy :: Proxy '[l]) r
 
 
 -- | Helper class 2 for 'hRearrange'
@@ -727,10 +724,10 @@
     hRearrange2' :: Proxy l -> Proxy ls -> HList rin -> HList rout -> r'
  
 instance (HRearrange ls rout (HList r'),
-         r'' ~ HList (LVPair l v ': r')) =>
-        HRearrange' l ls '[LVPair l v] rout r'' where
-   hRearrange2' _ ls (HCons lv@(LVPair v) _HNil) rout
-        = HCons (LVPair v `asTypeOf` lv) (hRearrange2 ls rout)
+         r'' ~ HList (Tagged l v ': r')) =>
+        HRearrange' l ls '[Tagged l v] rout r'' where
+   hRearrange2' _ ls (HCons lv@(Tagged v) _HNil) rout
+        = HCons (Tagged v `asTypeOf` lv) (hRearrange2 ls rout)
 
 data ExtraField l = ExtraField
 data FieldNotFound l = FieldNotFound
@@ -742,7 +739,7 @@
 
 -- | For improved error messages
 instance Fail (ExtraField l) => 
-          HRearrange '[] (LVPair l v ': a) (ExtraField l) where
+          HRearrange '[] (Tagged l v ': a) (ExtraField l) where
    hRearrange2 _ _ = ExtraField
 
 
diff --git a/Data/HList/RecordPuns.hs b/Data/HList/RecordPuns.hs
--- a/Data/HList/RecordPuns.hs
+++ b/Data/HList/RecordPuns.hs
@@ -12,7 +12,7 @@
 import Data.HList.Record
 import Data.HList.FakePrelude
 import Data.List
-
+import Data.HList.HList
 
 {- $ex
 
@@ -58,6 +58,18 @@
 fields called @a@ or @b@ they are overridden by the values of @a@ and @b@
 which are in scope.
 
+@( )@ parens mean the same thing as @{ }@, except the pattern match
+restricts the fields in the record supplied to be exactly the ones
+provided. In other words
+
+> [pun| (x y) |] = list
+> -- desugars to something like:
+> Record (HCons (Tagged x :: Tagged "x" s1)
+>              (HCons (Tagged x :: Tagged "y" s2)
+>               HNil)) = list
+
+Where the @s1@ and @s2@ are allowed to fit whatever is in the HList.
+
 See also @examples/pun.hs@.
 -}
 
@@ -92,6 +104,7 @@
 
 me :: Tree -> ExpQ
 me (C as) = foldr (\(l,e) acc -> [| $(mkPair l e) .*. $acc |]) [| emptyRecord |] (mes as)
+me (D _as) = error "Data.HList.RecordPuns.mp impossible"
 me a = do
     reportWarning $ "Data.HList.RecordPuns.mp implicit {} added around:" ++ show a
     me (C [a])
@@ -99,6 +112,7 @@
 mes :: [Tree] -> [(String, ExpQ)]
 mes (V a : V "@": b : c) = (a, [| $(me b) `hLeftUnion` $(dyn a) |]) : mes c
 mes (V a : C b : c)      = (a, me (C b)) : mes c
+mes (V a : D b : c)      = (a, me (C b)) : mes c
 mes (V a : b)            = (a, varE (mkName a)) : mes b
 mes [] = []
 mes inp = error $ "Data.HList.RecordPuns.mes: cannot translate remaining:" ++
@@ -107,6 +121,19 @@
 mp :: Tree -> PatQ
 mp (C as) = case unzip (mps as) of
     (a, b) -> viewP (extracts a) (tupP b)
+
+-- use of prime here (non GADT version) because it is better for type
+-- inference. See commentary surrounding HCons' in Data.HList.HList
+mp (D as) = conP 'Record
+  [viewP (varE 'prime) -- nicer to have [p| prime -> $( ... ) |],
+                       -- but ghc-7.6 rejects that over types
+   (foldr ( \ (n,p) xs -> conP 'HCons'
+                [viewP [| \x -> x `asTypeOf`
+                            (undefined :: Tagged $(litT (strTyLit n)) t) |]
+                (conP 'Tagged [p]),
+                xs])
+          (conP 'HNil' [])
+          (mps as))]
 mp a = do
     reportWarning $ "Data.HList.RecordPuns.mp implicit {} added around:" ++ show a
     mp (C [a])
@@ -114,13 +141,16 @@
 mps :: [Tree] -> [(String, PatQ)]
 mps (V a : V "@" : b : c) = (a, asP (mkName a) (mp b)) :  mps c
 mps (V a : C b : c) = (a, mp (C b)) : mps c
+mps (V a : D b : c) = (a, mp (D b)) : mps c
 mps (V a : b) = (a, varP (mkName a)) : mps b
 mps [] = []
 mps inp = error $ "Data.HList.RecordPuns.mps: cannot translate remaining pattern:" ++
                         show (map ppTree inp)
 
-
-data Tree = C [Tree] | V String deriving Show
+data Tree = C [Tree] -- ^ curly @{ }@
+          | D [Tree] -- ^ @(  )@
+          | V String -- ^ variable
+  deriving Show
 
 {- |
 
@@ -130,26 +160,32 @@
 >>> ppTree $ parseRec "{a b c {d e {} f @ g}}"
 "{a b c {d e {} f @ g}}"
 
-> ppTree $ parseRec "a b c {d e {} f @ g}"
+>>> ppTree $ parseRec "a b c {d e {} f @ g}"
 "{a b c {d e {} f @ g}}"
 
+>>> ppTree $ parseRec "(a b { (d) e } )"
+"(a b {(d) e})"
+
 -}
 parseRec :: String -> Tree
-parseRec str = case parseRec' 0 [[]] $ lexing str of
+parseRec str = case parseRec' 0 0 [[]] $ lexing str of
     [x] -> x -- avoid adding another layer if possible
     x -> C (reverse x)
 
-parseRec' :: Int -> [[Tree]] -> [String] -> [Tree]
-parseRec' n accum  ("{" : rest)  = parseRec' (n+1) ([] : accum) rest
-parseRec' n (a:b:c) ("}" : rest) = parseRec' (n-1) ((C (reverse a) : b) : c)  rest
-parseRec' n (b:c) (a   : rest)
-         | a `notElem` ["{","}"] = parseRec' n     ((V a : b) : c) rest
-parseRec' 0 (a:_) []             = a
-parseRec' _ accum e              = error ("Data.HList.RecordPuns.parseRec' unexpected: " ++ show e
+parseRec' :: Int -> Int -> [[Tree]] -> [String] -> [Tree]
+parseRec' n m accum  ("{" : rest)  = parseRec' (n+1) m ([] : accum) rest
+parseRec' n m accum  ("(" : rest)  = parseRec'  n (m+1) ([] : accum) rest
+parseRec' n m (a:b:c) ("}" : rest) = parseRec' (n-1) m ((C (reverse a) : b) : c)  rest
+parseRec' n m (a:b:c) (")" : rest) = parseRec' n (m-1) ((D (reverse a) : b) : c)  rest
+parseRec' n m (b:c) (a   : rest)
+         | a `notElem` ["{","}","(",")"] = parseRec' n m   ((V a : b) : c) rest
+parseRec' 0 0 (a:_) []             = a
+parseRec' _ _ accum e              = error ("Data.HList.RecordPuns.parseRec' unexpected: " ++ show e
                                             ++ "\n parsed:" ++ show (reverse accum))
 
 ppTree :: Tree -> String
 ppTree (C ts) = "{" ++ unwords (map ppTree ts) ++ "}"
+ppTree (D ts) = "(" ++ unwords (map ppTree ts) ++ ")"
 ppTree (V x)  = x
 
 lexing = unfoldr (\v -> case lex v of
diff --git a/Data/HList/TIP.hs b/Data/HList/TIP.hs
--- a/Data/HList/TIP.hs
+++ b/Data/HList/TIP.hs
@@ -68,9 +68,9 @@
 instance (HAppend (HList l) (HList l'), HTypeIndexed (HAppendList l l'))
            => HAppend (TIP l) (TIP l')
  where
-  type HAppendR (TIP l) (TIP l') = TIP (HAppendList l l')
   hAppend (TIP l) (TIP l') = mkTIP (hAppend l l')
 
+type instance HAppendR (TIP l) (TIP l') = TIP (HAppendList l l')
 
 -- instance HOccurrence e l l' => HOccurrence e (TIP l) l'
 --  where
@@ -145,7 +145,7 @@
 
 
 
->>> Sheep .*. tipyDelete (proxy::Proxy Breed) myTipyCow
+>>> Sheep .*. tipyDelete (Proxy::Proxy Breed) myTipyCow
 TIPH[Sheep, Key 42, Name "Angus", Price 75.5]
 
 >>> tipyUpdate Sheep myTipyCow
diff --git a/Data/HList/Variant.hs b/Data/HList/Variant.hs
--- a/Data/HList/Variant.hs
+++ b/Data/HList/Variant.hs
@@ -39,8 +39,8 @@
 -- | Turn proxy sequence into sequence of Nothings
 
 data HMaybeF = HMaybeF
-instance ((LVPair l (Proxy t) ~ a, b ~ LVPair l (Maybe t))) =>  ApplyAB HMaybeF a b   where
-    applyAB _ _ = LVPair Nothing
+instance ((Tagged l (Proxy t) ~ a, b ~ Tagged l (Maybe t))) =>  ApplyAB HMaybeF a b   where
+    applyAB _ _ = Tagged Nothing
 
 hMaybied x = hMap HMaybeF x
 
diff --git a/HList.cabal b/HList.cabal
--- a/HList.cabal
+++ b/HList.cabal
@@ -1,5 +1,5 @@
 Name:                HList
-Version:             0.3.2.0
+Version:             0.3.4.0
 Category:            Data
 Synopsis:            Heterogeneous lists
 Description:         HList is a record system providing strongly typed heterogenous lists, records,
@@ -37,13 +37,13 @@
 
 
 library
-  Build-Depends:       base >= 4 && < 5, template-haskell, ghc-prim, mtl
+  Build-Depends:       base >= 4 && < 5, template-haskell, ghc-prim, mtl,
+                       tagged
 
   Exposed-modules:     Data.HList,
                        Data.HList.CommonMain,
                        Data.HList.Data,
                        Data.HList.FakePrelude,
-                       Data.HList.FakePrelude.Proxy,
                        Data.HList.HArray,
                        Data.HList.HList,
                        Data.HList.HListPrelude,
diff --git a/examples/MainGhcGeneric1.hs b/examples/MainGhcGeneric1.hs
--- a/examples/MainGhcGeneric1.hs
+++ b/examples/MainGhcGeneric1.hs
@@ -303,9 +303,9 @@
 
 testVariant = (testVar1,(testVar2,(testVar3)))
  where
-  animalVar =  key   .=. (proxy::Proxy Integer)
-           .*. name  .=. (proxy::Proxy String)
-           .*. breed .=. (proxy::Proxy Breed)
+  animalVar =  key   .=. (Proxy::Proxy Integer)
+           .*. name  .=. (Proxy::Proxy String)
+           .*. breed .=. (Proxy::Proxy Breed)
            .*. emptyRecord
   testVar1 = mkVariant name "angus" animalVar
   testVar2 = unVariant key testVar1
diff --git a/examples/TIPTransform.hs b/examples/TIPTransform.hs
--- a/examples/TIPTransform.hs
+++ b/examples/TIPTransform.hs
@@ -60,7 +60,7 @@
 
 instance (HMember op db b, TransTIP' b op (TIP db)) 
     => TransTIP op (TIP db) where
-    ttip = ttip' (proxy ::Proxy b)
+    ttip = ttip' (Proxy ::Proxy b)
 
 class TransTIP' (b :: Bool) op db where
     ttip' :: Proxy b -> op -> db -> db
diff --git a/examples/TIPTransformM.hs b/examples/TIPTransformM.hs
--- a/examples/TIPTransformM.hs
+++ b/examples/TIPTransformM.hs
@@ -127,7 +127,7 @@
 -- can be instantiated either to a monad type constructor, or (arg->).
 instance (Monad m, HMember op db b, TransTIPM' b m (m' op) (TIP db))
     => TransTIPM m (m' op) (TIP db) where
-    ttipM = ttipM' (proxy :: Proxy b)
+    ttipM = ttipM' (Proxy :: Proxy b)
 
 class Monad m => TransTIPM' (b :: Bool) m op db where
     ttipM' :: Proxy b -> op -> db -> m db
