diff --git a/mu-schema.cabal b/mu-schema.cabal
--- a/mu-schema.cabal
+++ b/mu-schema.cabal
@@ -1,51 +1,55 @@
-cabal-version:       >=1.10
-name:                mu-schema
-version:             0.1.0.0
-synopsis:            Format-independent schemas for serialization
-description:         With @mu-schema@ you can describe schemas using type-level constructs, and derive serializers from those. See @mu-avro@, @mu-protobuf@ for the actual adapters.
--- bug-reports:
-license:             Apache-2.0
-license-file:        LICENSE
-author:              Alejandro Serrano, Flavio Corpa
-maintainer:          alejandro.serrano@47deg.com
-copyright:           Copyright © 2019-2020 <http://47deg.com 47 Degrees>
-category:            Network
-build-type:          Simple
-extra-source-files:  CHANGELOG.md
-homepage:            https://higherkindness.io/mu-haskell/
-bug-reports:         https://github.com/higherkindness/mu-haskell/issues
+name:               mu-schema
+version:            0.2.0.0
+synopsis:           Format-independent schemas for serialization
+description:
+  With @mu-schema@ you can describe schemas using type-level constructs, and derive serializers from those. See @mu-avro@, @mu-protobuf@ for the actual adapters.
 
+license:            Apache-2.0
+license-file:       LICENSE
+author:             Alejandro Serrano, Flavio Corpa
+maintainer:         alejandro.serrano@47deg.com
+copyright:          Copyright © 2019-2020 <http://47deg.com 47 Degrees>
+cabal-version:      >=1.10
+category:           Network
+build-type:         Simple
+extra-source-files: CHANGELOG.md
+homepage:           https://higherkindness.io/mu-haskell/
+bug-reports:        https://github.com/higherkindness/mu-haskell/issues
+
 source-repository head
   type:     git
   location: https://github.com/higherkindness/mu-haskell
 
 library
-  exposed-modules:     Mu.Schema
-                     , Mu.Schema.Definition
-                     , Mu.Schema.Interpretation
-                     , Mu.Schema.Interpretation.Schemaless
-                     , Mu.Schema.Interpretation.Anonymous
-                     , Mu.Schema.Class
-                     , Mu.Schema.Registry
-                     , Mu.Schema.Conversion.TypesToSchema
-                     , Mu.Schema.Conversion.SchemaToTypes
-                     , Mu.Schema.Examples
-                     , Mu.Schema.Annotations
-                     , Mu.Adapter.Json
-                     , Data.Functor.MaybeLike
+  exposed-modules:
+    Data.Functor.MaybeLike
+    Mu.Adapter.Json
+    Mu.Schema
+    Mu.Schema.Annotations
+    Mu.Schema.Class
+    Mu.Schema.Conversion.SchemaToTypes
+    Mu.Schema.Conversion.TypesToSchema
+    Mu.Schema.Definition
+    Mu.Schema.Examples
+    Mu.Schema.Interpretation
+    Mu.Schema.Interpretation.Anonymous
+    Mu.Schema.Interpretation.Schemaless
+    Mu.Schema.Registry
+
   -- other-modules:
   -- other-extensions:
-  build-depends:       base >=4.12 && <5
-                     , sop-core
-                     , containers
-                     , unordered-containers
-                     , bytestring
-                     , vector
-                     , text
-                     , aeson
-                     , template-haskell >= 2.12
-                     , th-abstraction
-  hs-source-dirs:      src
-  default-language:    Haskell2010
-  ghc-options:         -Wall
-                       -fprint-potential-instances
+  build-depends:
+      aeson
+    , base                  >=4.12 && <5
+    , bytestring
+    , containers
+    , sop-core
+    , template-haskell      >=2.12
+    , text
+    , th-abstraction
+    , unordered-containers
+    , vector
+
+  hs-source-dirs:   src
+  default-language: Haskell2010
+  ghc-options:      -Wall -fprint-potential-instances
diff --git a/src/Mu/Schema/Class.hs b/src/Mu/Schema/Class.hs
--- a/src/Mu/Schema/Class.hs
+++ b/src/Mu/Schema/Class.hs
@@ -32,7 +32,7 @@
 does not suit you, use 'CustomFieldMapping'.
 -}
 module Mu.Schema.Class (
-  WithSchema(..)
+  WithSchema(..), unWithSchema
 , FromSchema(..), fromSchema'
 , ToSchema(..), toSchema'
 , CustomFieldMapping(..)
@@ -54,8 +54,14 @@
 
 -- | Tags a value with its schema.
 --   For usage with @deriving via@.
-newtype WithSchema (w :: Type -> Type) (sch :: Schema tn fn) (sty :: tn) a = WithSchema a
+newtype WithSchema (w :: Type -> Type) (sch :: Schema tn fn) (sty :: tn) a where
+  WithSchema :: forall tn fn (w :: Type -> Type) (sch :: Schema tn fn) (sty :: tn) a.
+                a -> WithSchema w sch sty a
 
+unWithSchema :: forall tn fn (w :: Type -> Type) (sch :: Schema tn fn) (sty :: tn) a.
+                WithSchema w sch sty a -> a
+unWithSchema (WithSchema x) = x
+
 -- | Defines the conversion of a type @t@ into a 'Term'
 --   which follows the schema @sch@.
 --   You can give an optional mapping between the
@@ -85,6 +91,19 @@
     fromSchema :: (Generic t, GFromSchemaTypeDef w sch '[] (sch :/: sty) (Rep t) )
                => Term w sch (sch :/: sty) -> t
   fromSchema x = to (fromSchemaTypeDef (Proxy @'[]) x)
+
+instance (sch :/: sty ~ 'DRecord sty fields)
+         => ToSchema w sch sty (Term w sch ('DRecord sty fields)) where
+  toSchema = id
+instance (sch :/: sty ~ 'DEnum sty choices)
+         => ToSchema w sch sty (Term w sch ('DEnum sty choices)) where
+  toSchema = id
+instance (sch :/: sty ~ 'DRecord sty fields)
+         => FromSchema w sch sty (Term w sch ('DRecord sty fields)) where
+  fromSchema = id
+instance (sch :/: sty ~ 'DEnum sty choices)
+         => FromSchema w sch sty (Term w sch ('DEnum sty choices)) where
+  fromSchema = id
 
 -- | Conversion from Haskell type to schema term.
 --   This version is intended for usage with @TypeApplications@:
diff --git a/src/Mu/Schema/Definition.hs b/src/Mu/Schema/Definition.hs
--- a/src/Mu/Schema/Definition.hs
+++ b/src/Mu/Schema/Definition.hs
@@ -135,6 +135,15 @@
     -- | Represents a choice between types.
   | TUnion  [FieldTypeB builtin typeName]
 
+instance KnownName n => KnownName ('DRecord n fields) where
+  nameVal _ = nameVal (Proxy @n)
+instance KnownName n => KnownName ('DEnum n choices) where
+  nameVal _ = nameVal (Proxy @n)
+instance KnownName n => KnownName ('ChoiceDef n) where
+  nameVal _ = nameVal (Proxy @n)
+instance KnownName n => KnownName ('FieldDef n t) where
+  nameVal _ = nameVal (Proxy @n)
+
 -- | Lookup a type in a schema by its name.
 type family (sch :: Schema t f) :/: (name :: t) :: TypeDef t f where
   '[] :/: name = TypeError ('Text "Cannot find type " ':<>: 'ShowType name ':<>: 'Text " in the schema")
