diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.9.2
+
+- Add `runcurryX` for applying an uncurried function to a `Rec` passing through the `XRec` machinery to strip out syntactic noise.
+
 # 0.9.0
 
 - A new `SRec` type for constant time field access for records with densely packed `Storable` fields. Conversion from `Rec` is accomplished with `toSRec`, while `fromSRec` takes you back to `Rec`. Record updates are fairly slow compared to native Haskell records and even `Rec`, but reading a field is as fast as anything.
diff --git a/Data/Vinyl/Class/Method.hs b/Data/Vinyl/Class/Method.hs
--- a/Data/Vinyl/Class/Method.hs
+++ b/Data/Vinyl/Class/Method.hs
@@ -1,18 +1,19 @@
-{-# LANGUAGE AllowAmbiguousTypes #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE UndecidableInstances #-}
-{-# LANGUAGE TypeApplications #-}
-{-# LANGUAGE TypeOperators #-}
-{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE AllowAmbiguousTypes   #-}
+{-# LANGUAGE BangPatterns          #-}
+{-# LANGUAGE CPP                   #-}
+{-# LANGUAGE ConstraintKinds       #-}
+{-# LANGUAGE DataKinds             #-}
+{-# LANGUAGE FlexibleContexts      #-}
+{-# LANGUAGE FlexibleInstances     #-}
 {-# LANGUAGE GADTs                 #-}
-{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds             #-}
 {-# LANGUAGE RankNTypes            #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
-{-# LANGUAGE BangPatterns          #-}
-{-# LANGUAGE ConstraintKinds       #-}
+{-# LANGUAGE TypeApplications      #-}
+{-# LANGUAGE TypeFamilies          #-}
+{-# LANGUAGE TypeOperators         #-}
+{-# LANGUAGE UndecidableInstances  #-}
 
 {-| This module uses 'RecAll' to extend common typeclass methods to records.
     Generally, it is preferable to use the original typeclass methods to these
@@ -57,7 +58,9 @@
 import Data.Vinyl.Derived (FieldRec)
 import Data.Vinyl.Functor ((:.), ElField(..))
 import Data.Vinyl.TypeLevel
+#if __GLASGOW_HASKELL__ < 804
 import Data.Monoid
+#endif
 
 recEq :: RecAll f rs Eq => Rec f rs -> Rec f rs -> Bool
 recEq RNil RNil = True
diff --git a/Data/Vinyl/Core.hs b/Data/Vinyl/Core.hs
--- a/Data/Vinyl/Core.hs
+++ b/Data/Vinyl/Core.hs
@@ -32,7 +32,9 @@
 module Data.Vinyl.Core where
 
 import Data.Monoid (Monoid)
+#if __GLASGOW_HASKELL__ < 804
 import Data.Semigroup
+#endif
 import Foreign.Ptr (castPtr, plusPtr)
 import Foreign.Storable (Storable(..))
 import Data.Vinyl.Functor
diff --git a/Data/Vinyl/Curry.hs b/Data/Vinyl/Curry.hs
--- a/Data/Vinyl/Curry.hs
+++ b/Data/Vinyl/Curry.hs
@@ -14,6 +14,7 @@
 
 import           Data.Vinyl
 import           Data.Vinyl.Functor
+import           Data.Vinyl.XRec
 
 -- * Currying
 
@@ -100,6 +101,20 @@
 runcurry' f (Identity x :& xs) = runcurry' (f x) xs
 {-# INLINABLE runcurry' #-}
 
+-- | Apply an uncurried function to an 'XRec'.
+xruncurry :: CurriedX f ts a -> XRec f ts -> a
+xruncurry x RNil = x
+xruncurry f (x :& xs) = xruncurry (f (unX x)) xs
+{-# INLINABLE xruncurry #-}
+
+-- | Apply an uncurried function to a 'Rec' like 'runcurry' except the
+-- function enjoys a type simplified by the 'XData' machinery that
+-- strips away type-induced noise like 'Identity', 'Compose', and
+-- 'ElField'.
+runcurryX :: IsoXRec f ts => CurriedX f ts a -> Rec f ts -> a
+runcurryX f = xruncurry f . toXRec
+{-# INLINE runcurryX #-}
+
 -- * Applicative Combinators
 
 {-|
@@ -155,3 +170,16 @@
 type family CurriedF (f :: u -> *) (ts :: [u]) a where
   CurriedF f '[] a = a
   CurriedF f (t ': ts) a = f t -> CurriedF f ts a
+
+{-|
+For the type-level list @ts@, @'CurriedX' f ts a@ is a curried function type
+from arguments of type @HKD f t@ for @t@ in @ts@, to a result of type @a@.
+
+>>> :set -XTypeOperators
+>>> :kind! CurriedX (Maybe :. Identity) '[Int, Bool, String] Int
+CurriedX (Maybe :. Identity) '[Int, Bool, String] Int :: *
+= Maybe Int -> Maybe Bool -> Maybe [Char] -> Int
+-}
+type family CurriedX (f :: u -> *) (ts :: [u]) a where
+  CurriedX f '[] a = a
+  CurriedX f (t ': ts) a = HKD f t -> CurriedX f ts a
diff --git a/Data/Vinyl/Functor.hs b/Data/Vinyl/Functor.hs
--- a/Data/Vinyl/Functor.hs
+++ b/Data/Vinyl/Functor.hs
@@ -32,7 +32,9 @@
   ) where
 
 import Data.Proxy
+#if __GLASGOW_HASKELL__ < 804
 import Data.Semigroup
+#endif
 import Foreign.Ptr (castPtr)
 import Foreign.Storable
 import GHC.TypeLits
diff --git a/tests/Intro.lhs b/tests/Intro.lhs
--- a/tests/Intro.lhs
+++ b/tests/Intro.lhs
@@ -21,6 +21,7 @@
 > {-# LANGUAGE FlexibleContexts, FlexibleInstances, NoMonomorphismRestriction #-}
 > {-# LANGUAGE GADTs, TypeSynonymInstances, TemplateHaskell, StandaloneDeriving #-}
 > {-# LANGUAGE TypeApplications #-}
+> module Intro where
 > import Data.Vinyl
 > import Data.Vinyl.Functor
 > import Control.Lens hiding (Identity)
diff --git a/tests/doctests.hs b/tests/doctests.hs
new file mode 100644
--- /dev/null
+++ b/tests/doctests.hs
@@ -0,0 +1,6 @@
+import Test.DocTest
+
+main :: IO ()
+main = doctest [ "tests/Intro.lhs"
+               , "Data/Vinyl/Functor.hs"
+               , "Data/Vinyl/Curry.hs" ]
diff --git a/vinyl.cabal b/vinyl.cabal
--- a/vinyl.cabal
+++ b/vinyl.cabal
@@ -1,5 +1,5 @@
 name:                vinyl
-version:             0.9.1
+version:             0.9.2
 synopsis:            Extensible Records
 -- description:
 license:             MIT
@@ -12,7 +12,7 @@
 build-type:          Simple
 cabal-version:       >=1.10
 extra-source-files:  CHANGELOG.md
-tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1
+tested-with:         GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.3
 
 description: Extensible records for Haskell with lenses.
 
@@ -80,8 +80,9 @@
 test-suite doctests
   type:             exitcode-stdio-1.0
   hs-source-dirs:   tests
-  main-is:          Intro.lhs
-  build-depends:    base >= 4.7 && <= 5, lens, vinyl, doctest >= 0.8, singletons >= 0.10
+  other-modules:    Intro
+  main-is:          doctests.hs
+  build-depends:    base >= 4.7 && <= 5, lens, doctest >= 0.8, singletons >= 0.10, vinyl
   default-language: Haskell2010
 
 test-suite spec
