The MessageInterpolator is only created by the validator when the servlet starts.  I18n is essentially in a request scope (although it isn't tagged as such currently and that needs to get fixed) because when it gets created it looks at the HttpServletRequest (which is in request scope).  According to http://code.google.com/p/google-guice/wiki/Scopes#Scopes_and_Concurrency when you are in a broad scope (e.g. the running servlet) and require an object in a narrow scope (e.g. I18n) you need to use the provider rather than injecting directly.  My testing bears this out.