Posting this on the user's list rather than dev which is where this belongs
If you bind a service implementation to an interface, tapestry will create a proxy for you which is why you can't cast it to a concrete type. The proxy allows live class reloading and other AOP goodies. Unfortunately your use case requires a hack. You can either create an uber interface which extends the two interfaces, or you can do the following: public class Hack { private SineTraceGenerator sineTraceGenerator; public Hack(SineTraceGenerator sineTraceGenerator) { this.sineTraceGenerator = sineTraceGenerator; } public SinePattern getSinePattern() { return sineTraceGenerator; } public TraceGenerator getTraceGenerator() { return sineTraceGenerator; } } AppModule public Hack buildHack(@AutoBuild SineTraceGenerator sineTraceGenerator) { return new Hack(sineTraceGenerator); } public SinePattern buildSinePattern(Hack hack) { return hack.getSinePattern(); } public TraceGenerator buildTraceGenerator(Hack hack) { return hack.getTraceGenerator(); }