diff --git a/bookkeeping.cabal b/bookkeeping.cabal
--- a/bookkeeping.cabal
+++ b/bookkeeping.cabal
@@ -1,5 +1,5 @@
 name:                bookkeeping
-version:             0.2.1.4
+version:             0.3.0.0
 synopsis:            A module for bookkeeping by double entry.
 description:
     A module for bookkeeping by double entry. This module provides a way to do bookkeeping programmatically.
@@ -26,6 +26,9 @@
   default-extensions:  OverloadedStrings
                      , RecordWildCards
   other-extensions:    GeneralizedNewtypeDeriving
+  ghc-options:         -Wcompat -Wall
+  if !impl(ghc >= 8.0)
+    build-depends: semigroups == 0.18.*
 
 test-suite bookkeeping-test
   type:                exitcode-stdio-1.0
diff --git a/src/Business/Bookkeeping.hs b/src/Business/Bookkeeping.hs
--- a/src/Business/Bookkeeping.hs
+++ b/src/Business/Bookkeeping.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE Strict #-}
 {-# LANGUAGE StrictData #-}
+{-# LANGUAGE CPP #-}
 
 {- |
 Module      :  Business.Bookkeeping
@@ -26,6 +27,7 @@
   , month
   , activity
   , dateTrans
+  , categoryName
 
   -- * Converters
   , runTransactions
@@ -36,14 +38,14 @@
   , MonthTransactions
   , DateTransactions
   , Transaction(..)
-  , Year(..)
-  , Month(..)
-  , Date(..)
-  , Description(..)
-  , SubDescription(..)
-  , Amount(..)
+  , Year
+  , Month
+  , Date
+  , Description
+  , SubDescription
+  , Amount
   , Category(..)
-  , CategoryName(..)
+  , CategoryName
   , CategoryType(..)
   , DebitCategory(..)
   , CreditCategory(..)
@@ -53,6 +55,7 @@
 import qualified Data.DList as DList
 import Data.DList (DList)
 import Data.Monoid ((<>))
+import qualified Data.Semigroup as Sem
 import Data.String (IsString(..))
 import Data.Text (Text)
 import qualified Data.Text as T
@@ -162,14 +165,24 @@
         [ "tDay: " <> (T.pack . show) tDay
         , "tDescription: " <> unDescription tDescription
         , "tSubDescription: " <> unSubDescription tSubDescription
-        , "tDebit: " <> (unCategoryName . cName . unDebitCategory) tDebit <>
-          " (" <>
-          (T.pack . show . cType . unDebitCategory) tDebit <>
-          ")"
-        , "tCredit: " <> (unCategoryName . cName . unCreditCategory) tCredit <>
-          " (" <>
-          (T.pack . show . cType . unCreditCategory) tCredit <>
-          ")"
+        , T.concat
+          [ "tDebit: "
+          , (unCategoryName . cName . unDebitCategory) tDebit
+          , maybe "" (" - " <>) $
+            (unCategorySubName . cName . unDebitCategory) tDebit
+          , " ("
+          , (T.pack . show . cType . unDebitCategory) tDebit
+          , ")"
+          ]
+        , T.concat
+          [ "tCredit: "
+          , (unCategoryName . cName . unCreditCategory) tCredit
+          , maybe "" (" - " <>) $
+            (unCategorySubName . cName . unCreditCategory) tCredit
+          , " ("
+          , (T.pack . show . cType . unCreditCategory) tCredit
+          , ")"
+          ]
         , "tAmount: " <> (T.pack . show . unAmount) tAmount
         ]
 
@@ -220,9 +233,14 @@
 instance IsString Description where
   fromString = Description . fromString
 
+instance Sem.Semigroup Description where
+  Description a <> Description b = Description $ mappend a b
+
 instance Monoid Description where
   mempty = Description mempty
-  mappend (Description a) (Description b) = Description $ mappend a b
+#if !(MIN_VERSION_base(4,11,0))
+  mappend = (Sem.<>)
+#endif
 
 newtype SubDescription = SubDescription
   { unSubDescription :: Text
@@ -231,9 +249,14 @@
 instance IsString SubDescription where
   fromString = SubDescription . fromString
 
+instance Sem.Semigroup SubDescription where
+  SubDescription a <> SubDescription b = SubDescription $ mappend a b
+
 instance Monoid SubDescription where
   mempty = SubDescription mempty
-  mappend (SubDescription a) (SubDescription b) = SubDescription $ mappend a b
+#if !(MIN_VERSION_base(4,11,0))
+  mappend = (Sem.<>)
+#endif
 
 newtype Amount = Amount
   { unAmount :: Int
@@ -254,12 +277,27 @@
   , cType :: CategoryType
   } deriving (Show, Read, Ord, Eq)
 
-newtype CategoryName = CategoryName
-  { unCategoryName :: Text
+data CategoryName = CategoryName
+  { name :: Text
+  , sub :: Maybe Text
   } deriving (Show, Read, Ord, Eq)
 
+
+unCategoryName :: CategoryName -> Text
+unCategoryName CategoryName {..} = name
+
+unCategorySubName :: CategoryName -> Maybe Text
+unCategorySubName CategoryName {..} = sub
+
+categoryName :: Text -> Maybe Text -> CategoryName
+categoryName = CategoryName
+
 instance IsString CategoryName where
-  fromString = CategoryName . fromString
+  fromString str =
+    CategoryName
+      { name = fromString str
+      , sub = Nothing
+      }
 
 data CategoryType
   = Assets
