Free monads, but not only. Depends on how close these interfaces should be to the essence of this notion. Free monads are the best. Also, usual interpretable languages may be a good competitor. Bare functions and Service Handle are a bit dumber. FT/mtl do not posses the needed properties.