I realized that things like common subexpression hoisting and the like are really much more valuable in MLton that I would have guessed. In Scheme the point behind such optimizations (as opposed to the user having to do it by hand) was largely macros (which are going to insert lots of opportunities). In MLton the correspnding opportunities come from cross-module inlining.