Are those types just aliases of String?
data Root
= RootPosix
| RootWindowsVolume Char
| RootWindowsCurrentVolume
data FilePath = FilePath
{ pathRoot :: Maybe Root
, pathDirectories :: [String]
, pathBasename :: Maybe String
, pathExtensions :: [String]
}Path carries String-like information, it can even be easily converted to and from strings. Yet, it's a strong type that won't let you write something like 'path </> file_contents' (although, with overloaded strings, you can do 'path </> "file_name"').
UTCTime is not String-like.