diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
 # purescript-bridge
 
-Translate your Haskell types to PureScript types.
+Translate your Haskell types to PureScript types. It should in theory work for almost all Haskell types, including type constructors!
+You just have to instantiate it with dummy parameters from e.g. "Language.PureScript.Bridge.TypeParameters". 
 
 For compatible JSON representations you should be using [aeson](http://hackage.haskell.org/package/aeson)'s generic encoding/decoding with default options
 and `gAesonEncodeJson` and `gAesonDecodeJson` from the [purescript-argonaut-codecs](https://github.com/purescript-contrib/purescript-argonaut-codecs)
diff --git a/purescript-bridge.cabal b/purescript-bridge.cabal
--- a/purescript-bridge.cabal
+++ b/purescript-bridge.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.3.0.6
+version:             0.3.1.0
 
 -- A short (one-line) description of the package.
 synopsis:            Generate PureScript data types from Haskell data types
@@ -53,12 +53,13 @@
 
 library
   -- Modules exported by the library.
-  exposed-modules: Language.PureScript.Bridge.SumType
-                , Language.PureScript.Bridge.TypeInfo
-                , Language.PureScript.Bridge.Tuple
+  exposed-modules: Language.PureScript.Bridge
                 , Language.PureScript.Bridge.Primitives
-                , Language.PureScript.Bridge
                 , Language.PureScript.Bridge.Printer
+                , Language.PureScript.Bridge.PSTypes
+                , Language.PureScript.Bridge.SumType
+                , Language.PureScript.Bridge.Tuple
+                , Language.PureScript.Bridge.TypeInfo
                 , Language.PureScript.Bridge.TypeParameters
 
   -- Modules included in this library but not exported.
diff --git a/src/Language/PureScript/Bridge.hs b/src/Language/PureScript/Bridge.hs
--- a/src/Language/PureScript/Bridge.hs
+++ b/src/Language/PureScript/Bridge.hs
@@ -71,7 +71,9 @@
 
 -- | Translate leaf types in a sum type to match PureScript types.
 bridgeSumType :: TypeBridge -> SumType -> SumType
-bridgeSumType br (SumType t cs) = SumType t $ map (bridgeConstructor br) cs
+bridgeSumType br (SumType t cs) = SumType fixedT $ map (bridgeConstructor br) cs
+  where
+    fixedT= t { typeParameters = map fixTypeParameters (typeParameters t)}
 
 {--|
  -- Optimistically and recursively translate types: If the passed TypeBridge returns Nothing,
diff --git a/src/Language/PureScript/Bridge/PSTypes.hs b/src/Language/PureScript/Bridge/PSTypes.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/PureScript/Bridge/PSTypes.hs
@@ -0,0 +1,75 @@
+{-# LANGUAGE OverloadedStrings #-}
+-- | PureScript types to be used for bridges, e.g. in "Language.PureScript.Bridge.Primitives".
+module Language.PureScript.Bridge.PSTypes where
+
+import Data.Monoid
+import qualified Data.Text as T
+
+import Language.PureScript.Bridge.TypeInfo
+
+-- | Uses  type parameters from existing TypeInfo:
+psArray :: TypeInfo -> TypeInfo
+psArray t = t {
+    typePackage = "purescript-prim"
+  , typeModule = "Prim"
+  , typeName = "Array"
+  }
+
+psBool :: TypeInfo
+psBool = TypeInfo {
+    typePackage = "purescript-prim"
+  , typeModule = "Prim"
+  , typeName = "Boolean"
+  , typeParameters = []
+  }
+
+-- | Uses  type parameters from existing TypeInfo:
+psEither :: TypeInfo -> TypeInfo
+psEither t = t {
+    typePackage = "purescript-either"
+  , typeModule = "Data.Either"
+  , typeName = "Either"
+  }
+
+psInt :: TypeInfo
+psInt = TypeInfo {
+    typePackage = "purescript-prim"
+  , typeModule = "Prim"
+  , typeName = "Int"
+  , typeParameters = []
+  }
+
+-- | Uses  type parameters from existing TypeInfo:
+psMaybe :: TypeInfo -> TypeInfo
+psMaybe t = t {
+    typePackage = "purescript-maybe"
+  , typeModule = "Data.Maybe"
+  , typeName = "Maybe"
+  }
+
+
+psString :: TypeInfo
+psString = TypeInfo {
+    typePackage = "purescript-prim"
+  , typeModule = "Prim"
+  , typeName = "String"
+  , typeParameters = []
+  }
+
+-- | Uses  type parameters from existing TypeInfo:
+psTuple :: TypeInfo -> TypeInfo
+psTuple t = t {
+      typePackage = "purescript-tuples"
+    , typeModule = if size == 2 then "Data.Tuple" else "Data.Tuple.Nested"
+    , typeName = "Tuple" <> if size == 2 then "" else T.pack (show size)
+    }
+  where
+    size = length (typeParameters t)
+
+psUnit :: TypeInfo
+psUnit = TypeInfo  {
+    typePackage = "purescript-prelude"
+  , typeModule = "Prelude"
+  , typeName = "Unit"
+  , typeParameters = []
+  }
diff --git a/src/Language/PureScript/Bridge/Primitives.hs b/src/Language/PureScript/Bridge/Primitives.hs
--- a/src/Language/PureScript/Bridge/Primitives.hs
+++ b/src/Language/PureScript/Bridge/Primitives.hs
@@ -3,71 +3,30 @@
 
 
 import Language.PureScript.Bridge.TypeInfo
+import Language.PureScript.Bridge.PSTypes
 
-unitBridge :: TypeBridge
-unitBridge t
-  | eqTypeName "()" t = Just $ t {
-      typePackage = "purescript-prelude"
-    , typeModule = "Prelude"
-    , typeName = "Unit"
-    }
-  | otherwise = Nothing
 
 boolBridge :: TypeBridge
-boolBridge t
-  | eqTypeName "Bool" t = Just $ t {
-      typePackage = "purescript-prim"
-    , typeModule = "Prim"
-    , typeName = "Boolean"
-    , typeParameters = []
-    }
-  | otherwise = Nothing
-
-intBridge :: TypeBridge
-intBridge t
-  | eqTypeName "Int" t = Just $ t {
-      typePackage = "purescript-prim"
-    , typeModule = "Prim"
-    }
-  | otherwise = Nothing
+boolBridge = mkBridgeTo (eqTypeName "Bool") psBool
 
+eitherBridge :: TypeBridge
+eitherBridge = mkBridgeTo1 (eqTypeName "Either") psEither
 
-stringBridge :: TypeBridge
-stringBridge t
-  | isStringLike = Just $ t {
-      typePackage = "purescript-prim"
-    , typeModule = "Prim"
-    , typeName = "String"
-    , typeParameters = []
-    }
-  | otherwise = Nothing
-  where
-    isStringLike = isText || isString
-    isText = typeName t == "Text"
-    isString = typeName t == "[]" && all ((==) "Char" . typeName) (typeParameters t)
+intBridge :: TypeBridge
+intBridge = mkBridgeTo (eqTypeName "Int") psInt
 
 listBridge :: TypeBridge
-listBridge t
-  | eqTypeName "[]" t = Just $ t {
-      typePackage = "purescript-prim"
-    , typeModule = "Prim"
-    , typeName = "Array"
-    }
-  | otherwise = Nothing
+listBridge = mkBridgeTo1 (eqTypeName "[]") psArray
 
 maybeBridge :: TypeBridge
-maybeBridge t
-  | eqTypeName "Maybe" t = Just $ t {
-      typePackage = "purescript-maybe"
-    , typeModule = "Data.Maybe"
-    }
-  | otherwise = Nothing
+maybeBridge = mkBridgeTo1 (eqTypeName "Maybe") psMaybe
 
+stringBridge :: TypeBridge
+stringBridge = mkBridgeTo isStringLike psString
+  where
+    isStringLike t = isText t || isString t
+    isText t = typeName t == "Text"
+    isString t = typeName t == "[]" && all ((==) "Char" . typeName) (typeParameters t)
 
-eitherBridge :: TypeBridge
-eitherBridge t
-  | eqTypeName "Either" t = Just $ t {
-      typePackage = "purescript-either"
-    , typeModule = "Data.Either"
-    }
-  | otherwise = Nothing
+unitBridge :: TypeBridge
+unitBridge = mkBridgeTo (eqTypeName "()") psUnit
diff --git a/src/Language/PureScript/Bridge/Printer.hs b/src/Language/PureScript/Bridge/Printer.hs
--- a/src/Language/PureScript/Bridge/Printer.hs
+++ b/src/Language/PureScript/Bridge/Printer.hs
@@ -66,28 +66,27 @@
 
 sumTypeToText :: SumType -> Text
 sumTypeToText (SumType t cs) = T.unlines $
-    "data " <> typeName t <> " ="
+    "data " <> typeInfoToText True t <> " ="
   :  [ "    " <> T.intercalate "\n  | " (map (constructorToText 4) cs) ]
-  ++ [ "derive instance generic" <> typeName t <> " :: Generic " <> typeName t ]
+  ++ [ "\nderive instance generic" <> typeName t <> " :: Generic " <> typeName t ]
 
 
 constructorToText :: Int -> DataConstructor -> Text
-constructorToText _ (DataConstructor n (Left ts))  = n <> " " <> T.intercalate " " (map (typeInfoToText needParens) ts) <> "\n"
-  where needParens = length ts > 1
-constructorToText indentation (DataConstructor n (Right rs)) = T.unlines $
-      n <> " {"
-    :  [ spaces (indentation + 2) <> T.intercalate intercalation (map recordEntryToText rs) ]
-    ++ [ spaces indentation <> "}" ]
+constructorToText _ (DataConstructor n (Left ts))  = n <> " " <> T.intercalate " " (map (typeInfoToText False) ts)
+constructorToText indentation (DataConstructor n (Right rs)) =
+       n <> " {\n"
+    <> spaces (indentation + 2) <> T.intercalate intercalation (map recordEntryToText rs) <> "\n"
+    <> spaces indentation <> "}"
   where
     intercalation = "\n" <> spaces indentation <> "," <> " "
     spaces c = T.replicate c " "
 
 recordEntryToText :: RecordEntry -> Text
-recordEntryToText e = recLabel e <> " :: " <> typeInfoToText False (recValue e)
+recordEntryToText e = recLabel e <> " :: " <> typeInfoToText True (recValue e)
 
 
 typeInfoToText :: Bool -> TypeInfo -> Text
-typeInfoToText needParens t = if needParens && pLength > 0 then "(" <> inner <> ")" else inner
+typeInfoToText topLevel t = if needParens then "(" <> inner <> ")" else inner
   where
     inner = typeName t <>
       if pLength > 0
@@ -95,7 +94,8 @@
         else ""
     params = typeParameters t
     pLength = length params
-    textParameters = map (typeInfoToText (pLength > 1)) params
+    needParens = not topLevel && pLength > 0
+    textParameters = map (typeInfoToText False) params
 
 sumTypesToModules :: Modules -> [SumType] -> Modules
 sumTypesToModules = foldr sumTypeToModule
@@ -118,7 +118,9 @@
 typesToImportLines = foldr typeToImportLines
 
 typeToImportLines :: TypeInfo -> ImportLines -> ImportLines
-typeToImportLines t = M.alter (Just . updateLine) (typeModule t)
+typeToImportLines t = if not (T.null (typeModule t))
+    then M.alter (Just . updateLine) (typeModule t)
+    else id
   where
     updateLine Nothing = ImportLine (typeModule t) (S.singleton (typeName t))
     updateLine (Just (ImportLine m types)) = ImportLine m $ S.insert (typeName t) types
diff --git a/src/Language/PureScript/Bridge/Tuple.hs b/src/Language/PureScript/Bridge/Tuple.hs
--- a/src/Language/PureScript/Bridge/Tuple.hs
+++ b/src/Language/PureScript/Bridge/Tuple.hs
@@ -1,29 +1,19 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Language.PureScript.Bridge.Tuple where
 
-import Data.Monoid
-import Data.Text (Text)
 import qualified Data.Text as T
 
-
 import Language.PureScript.Bridge.TypeInfo
-
-data TupleParserState =
-  Start | OpenFound | ColonFound | Tuple | NoTuple deriving (Eq, Show)
+import Language.PureScript.Bridge.PSTypes (psTuple)
 
 
 tupleBridge :: TypeBridge
-tupleBridge t
-  | isTuple (typeName t) = Just $ t {
-      typePackage = "purescript-tuples"
-    , typeModule = if size == 2 then "Data.Tuple" else "Data.Tuple.Nested"
-    , typeName = "Tuple" <> if size == 2 then "" else T.pack (show size)
-    }
-  | otherwise = Nothing
-  where
-    size = length $ typeParameters t
+tupleBridge = mkBridgeTo1 isTuple psTuple
 
 
+data TupleParserState =
+  Start | OpenFound | ColonFound | Tuple | NoTuple deriving (Eq, Show)
+
 step :: TupleParserState -> Char -> TupleParserState
 step Start '(' = OpenFound
 step Start _ = NoTuple
@@ -35,5 +25,5 @@
 step Tuple _ = NoTuple
 step NoTuple _ = NoTuple
 
-isTuple :: Text -> Bool
-isTuple = (== Tuple) . T.foldl' step Start
+isTuple :: TypeInfo -> Bool
+isTuple = (== Tuple) . T.foldl' step Start . typeName
diff --git a/src/Language/PureScript/Bridge/TypeInfo.hs b/src/Language/PureScript/Bridge/TypeInfo.hs
--- a/src/Language/PureScript/Bridge/TypeInfo.hs
+++ b/src/Language/PureScript/Bridge/TypeInfo.hs
@@ -43,3 +43,15 @@
 -- | Little helper for type bridge implementers
 eqTypeName :: Text -> TypeInfo -> Bool
 eqTypeName name = (== name) . typeName
+
+-- | Helper for simple bridge creation for basic types
+mkBridgeTo :: (TypeInfo -> Bool) -> TypeInfo -> TypeBridge
+mkBridgeTo match r t
+  | match t = Just r
+  | otherwise = Nothing
+
+-- | Helper for simple bridge creation for type constructors
+mkBridgeTo1 :: (TypeInfo -> Bool) -> (TypeInfo -> TypeInfo) -> TypeBridge
+mkBridgeTo1 match r t
+  | match t = Just $ r t
+  | otherwise = Nothing
