diff --git a/lib/CheckMap.hs b/lib/CheckMap.hs
index 36cbf9d17a6a20b30f81527be4e6aada449ba0b5..9402170bff82f82912b0aa18725e5446167e5e7e 100644
--- a/lib/CheckMap.hs
+++ b/lib/CheckMap.hs
@@ -16,16 +16,17 @@ import qualified Data.Text                  as T
 import qualified Data.Vector                as V
 import           GHC.Generics               (Generic)
 
-import           LintWriter                 (Level (..), Lint (..),
-                                             LintResult (..), LintWriter, hint,
-                                             lintLevel)
+import           LintWriter                 (LintResult (..), LintWriter)
 import           Properties                 (checkProperty)
 import           Tiled2                     (Layer (layerName, layerProperties),
                                              Tiledmap (tiledmapLayers),
                                              loadTiledmap)
+import           Types                      (Level (..), Lint (..), hint,
+                                             lintLevel)
 import           Util                       (PrettyPrint (prettyprint),
                                              prettyprint)
 
+
 -- | What this linter produces: lints for a single map
 data MapResult a = MapResult
   { mapresultLayer   :: Maybe (Map Text (LintResult a))
diff --git a/lib/LintWriter.hs b/lib/LintWriter.hs
index bfe543e8b541066397f543ff6e57c809703412bc..66f16f1fb9539e9ceedf03aa7446d165497638b9 100644
--- a/lib/LintWriter.hs
+++ b/lib/LintWriter.hs
@@ -9,54 +9,10 @@ module LintWriter where
 import           Control.Monad.Trans.Maybe ()
 import           Control.Monad.Writer      (MonadTrans (lift),
                                             MonadWriter (tell), WriterT)
-import           Data.Aeson                (ToJSON (toJSON), (.=))
+import           Data.Aeson                (ToJSON (toJSON))
 import           Data.Text                 (Text)
-import           GHC.Generics              (Generic)
 
-import qualified Data.Aeson                as A
-import           Util                      (PrettyPrint (..), showText)
-
--- | Levels of errors and warnings, collectively called
--- "Hints" until I can think of some better name
-data Level = Warning | Suggestion | Info | Forbidden | Error | Fatal
-  deriving (Show, Generic, ToJSON)
-
--- | a hint comes with an explanation (and a level), or is a dependency
--- (in which case it'll be otherwise treated as an info hint)
-data Lint = Depends Dep | Lint Hint
-
-data Hint = Hint
-  { hintLevel :: Level
-  , hintMsg   :: Text
-  } deriving (Generic, ToJSON)
-
-lintLevel :: Lint -> Level
-lintLevel (Lint h)      = hintLevel h
-lintLevel (Depends dep) = Info
-
-instance PrettyPrint Lint where
-  prettyprint (Lint  Hint { hintMsg, hintLevel } ) =
-    showText hintLevel <> ": " <> hintMsg
-  prettyprint (Depends dep) =
-    "Info: found dependency: " <> prettyprint dep
-
-instance ToJSON Lint where
-  toJSON (Lint l) = toJSON l
-  toJSON (Depends dep) = A.object
-    [ "hintMsg" .= prettyprint dep
-    , "hintLevel" .= A.String "Dependency Info" ]
-
-
--- shorter constructor
-hint :: Level -> Text -> Lint
-hint level msg = Lint Hint { hintLevel = level, hintMsg = msg }
-
--- | TODO: add a reasonable representation of possible urls
-newtype Dep = Dep Text
-  deriving (Generic, ToJSON)
-
-instance PrettyPrint Dep where
-  prettyprint (Dep txt) = txt
+import           Types
 
 -- | a monad to collect hints. If it yields Left, then the
 -- map is flawed in some fundamental way which prevented us
diff --git a/lib/Types.hs b/lib/Types.hs
index 082b30e8218746a13b09f543f4894f0c7f958fb1..79bbfabee66e6544664c28cf5d012dcab33649ba 100644
--- a/lib/Types.hs
+++ b/lib/Types.hs
@@ -1,3 +1,61 @@
--- | basic types for workadventure maps
+{-# LANGUAGE DeriveAnyClass    #-}
+{-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE NamedFieldPuns    #-}
+{-# LANGUAGE OverloadedStrings #-}
 
+
+-- | basic types for the linter to eat and produce
+-- The dark magic making thse useful is in LintWriter
 module Types where
+
+import           Control.Monad.Trans.Maybe ()
+import           Data.Aeson                (ToJSON (toJSON), (.=))
+import           Data.Text                 (Text)
+import           GHC.Generics              (Generic)
+
+import qualified Data.Aeson                as A
+import           Util                      (PrettyPrint (..), showText)
+
+
+-- | Levels of errors and warnings, collectively called
+-- "Hints" until I can think of some better name
+data Level = Warning | Suggestion | Info | Forbidden | Error | Fatal
+  deriving (Show, Generic, ToJSON)
+
+-- | a hint comes with an explanation (and a level), or is a dependency
+-- (in which case it'll be otherwise treated as an info hint)
+data Lint = Depends Dep | Lint Hint
+
+-- | TODO: add a reasonable representation of possible urls
+newtype Dep = Dep Text
+  deriving (Generic, ToJSON)
+
+data Hint = Hint
+  { hintLevel :: Level
+  , hintMsg   :: Text
+  } deriving (Generic, ToJSON)
+
+-- | shorter constructor (called lint because (a) older name and
+-- (b) lint also exists and is monadic)
+hint :: Level -> Text -> Lint
+hint level msg = Lint Hint { hintLevel = level, hintMsg = msg }
+
+-- | dependencies just have level Info
+lintLevel :: Lint -> Level
+lintLevel (Lint h)      = hintLevel h
+lintLevel (Depends dep) = Info
+
+instance PrettyPrint Lint where
+  prettyprint (Lint  Hint { hintMsg, hintLevel } ) =
+    showText hintLevel <> ": " <> hintMsg
+  prettyprint (Depends dep) =
+    "Info: found dependency: " <> prettyprint dep
+
+instance ToJSON Lint where
+  toJSON (Lint l) = toJSON l
+  toJSON (Depends dep) = A.object
+    [ "hintMsg" .= prettyprint dep
+    , "hintLevel" .= A.String "Dependency Info" ]
+
+instance PrettyPrint Dep where
+  prettyprint (Dep txt) = txt
diff --git a/lib/Util.hs b/lib/Util.hs
index 3a0e1d4301a77cd55ad8bf4c87c61e79acee913f..42ba9608fca2fb17d4c32813cc2be7cdc72598d6 100644
--- a/lib/Util.hs
+++ b/lib/Util.hs
@@ -8,7 +8,7 @@ module Util where
 
 import           Data.Aeson as Aeson
 import           Data.Text  (Text)
-import           Data.Text  as T
+import qualified Data.Text  as T
 
 -- | haskell's many string types are FUN …
 showText :: Show a => a -> Text
diff --git a/tiled-hs.cabal b/tiled-hs.cabal
index 9b7b1718494567aea0c80c89f16d8f219acf8e56..4da4a4584c55f5c535ea279df8a81edc52ab398d 100644
--- a/tiled-hs.cabal
+++ b/tiled-hs.cabal
@@ -31,6 +31,7 @@ library
         Properties
         Tiled2
         Util
+        Types
     build-depends:    base ^>=4.14.1.0,
                       aeson,
                       bytestring,