Functions that build a path to the model and command files for some tests
Your code is fine and contains documentation, so there's not much to say at that point. That being said, your TestType problem can be tackled by transforming the type class to a data type:

data TestType = BenchTest | IntegrationTest

dataDir :: TestType -&gt; FilePath


However, that just removes the constraint and makes your program less flexible in the long run. So let us go back to the drawing board. The data directory is part of the test configuration. That sounds like a valid new data type:

data TestConfiguration = TestConfiguration
                       { dataDir :: FilePath
                       , ...
                       }

defaultConfiguration :: TestConfiguration
defaultConfiguration = TestConfiguration
                     { dataDir = "data" &lt;/&gt; "test"
                     , ...
                     }


Your two functions can now use TestConfiguration as first parameter instead of a TestType. This lets your user define adhoc configurations easily:

myConfiguration = defaultConfiguration
                { dataDir = "data" &lt;/&gt; "my" &lt;/&gt; "tuesday"
                , verbosity = VerboseLow
                , logFormat = TimeStamps
                , ... -- you get it
                }


Whether you want to allow record syntax, lenses or setters is left to you.