diff --git a/lib/GEODE/Metadata.hs b/lib/GEODE/Metadata.hs
index 529a50e78d811820d11059d513cdb00bfb6b3897..964e1aa1f9311c323e2a8b587747eda04ecd13ae 100644
--- a/lib/GEODE/Metadata.hs
+++ b/lib/GEODE/Metadata.hs
@@ -23,8 +23,7 @@ import GEODE.Metadata.Projector as Projector
 import GEODE.Metadata.SplitContext as SplitContext hiding (page, rank)
 import GEODE.Metadata.TSV as TSV
 import GEODE.Metadata.TSV.Header as TSV_Header
-  ( Concat(..), DefaultFields(..), Glue(..), HasDefaultHeader(..)
-  , WithDefaultHeader(..) )
+  ( DefaultFields(..), HasDefaultHeader(..), WithDefaultHeader(..), glue )
 import GEODE.Metadata.Types as Types
 
 list :: [Text] -> String
diff --git a/lib/GEODE/Metadata/TSV/Header.hs b/lib/GEODE/Metadata/TSV/Header.hs
index bfb43c770f5ffcab7d06d5fe280526762d31e7ec..0defa5eb7dc23d279f50fcfffd09d64ff549300d 100644
--- a/lib/GEODE/Metadata/TSV/Header.hs
+++ b/lib/GEODE/Metadata/TSV/Header.hs
@@ -1,12 +1,11 @@
 {-# LANGUAGE FlexibleInstances, ScopedTypeVariables, UndecidableInstances #-}
 module GEODE.Metadata.TSV.Header
   ( DefaultFields(..)
-  , Glue(..)
   , HasDefaultHeader(..)
-  , Concat(..)
   , WithDefaultHeader(..)
   , for
-  , getHeader ) where
+  , getHeader
+  , glue ) where
 
 import Data.ByteString.Char8 as StrictByteString (pack)
 import Data.Csv (FromNamedRecord(..), Header, ToNamedRecord(..), ToRecord(..))
@@ -18,15 +17,7 @@ newtype DefaultFields a = DefaultFields [String]
 class HasDefaultHeader a where
   defaultFields :: DefaultFields a
 
-instance (HasDefaultHeader a, HasDefaultHeader b) =>
-  HasDefaultHeader (Glue a b) where
-  defaultFields = DefaultFields (a ++ b)
-    where
-      DefaultFields a = (defaultFields :: DefaultFields a)
-      DefaultFields b = (defaultFields :: DefaultFields b)
-
-instance (HasDefaultHeader a, HasDefaultHeader b) =>
-  HasDefaultHeader (Concat (a, b)) where
+instance (HasDefaultHeader a, HasDefaultHeader b) => HasDefaultHeader (a, b) where
   defaultFields = DefaultFields (a ++ b)
     where
       DefaultFields a = (defaultFields :: DefaultFields a)
@@ -40,17 +31,14 @@ getHeader _ = StrictByteString.pack <$> fromList fields
 for :: HasDefaultHeader a => a
 for = undefined
 
-data Glue a b = Glue a b
-newtype Concat a = Concat a
-
-instance (ToNamedRecord a, ToNamedRecord b) => ToNamedRecord (Glue a b) where
-  toNamedRecord (Glue a b) = union (toNamedRecord a) (toNamedRecord b)
+glue :: a -> b -> WithDefaultHeader (a, b)
+glue a b = WithDefaultHeader (a, b)
 
-instance (ToNamedRecord a, ToNamedRecord b) => ToNamedRecord (Concat (a, b)) where
-  toNamedRecord (Concat (a, b)) = union (toNamedRecord a) (toNamedRecord b)
+instance (ToNamedRecord a, ToNamedRecord b) => ToNamedRecord (a, b) where
+  toNamedRecord (a, b) = union (toNamedRecord a) (toNamedRecord b)
 
-instance (FromNamedRecord a, FromNamedRecord b) => FromNamedRecord (Glue a b) where
-  parseNamedRecord nr = Glue <$> parseNamedRecord nr <*> parseNamedRecord nr
+instance (FromNamedRecord a, FromNamedRecord b) => FromNamedRecord (a, b) where
+  parseNamedRecord nr = (,) <$> parseNamedRecord nr <*> parseNamedRecord nr
 
 instance (HasDefaultHeader a, ToNamedRecord a) => ToRecord (WithDefaultHeader a) where
   toRecord (WithDefaultHeader a) = (toNamedRecord a !) <$> getHeader a