Very nice; I like the split up into two separate classes for EL / non-EL logic very much. Wanted to do this myself for a long time :) Only I'm wondering whether we - instead of having `InterpolationTerm` delegating to another `TermResolver` object - just should not have two types of `InterpolationTerm`:

    public abstract class InterpolationTerm {

        private InterpolationTerm {}
 
        public InterpolationTerm getInstance(String expression, Locale locale) {
            if(isElExpression(expression)) {
                return ...;
            }
            else {
            }
        }

       protected abstract void interpolate(String expression, Locale locale);
    }

    public class ElInterpolationTerm extends InterpolationTerm { ... }
    public class ParameterInterpolationTerm extends InterpolationTerm { ... }

WDYT, @stawny?