I generally like coding things to interfaces, as you often implement the interface twice; once for the real system, once for unit tests of other dependent components.  Not using interfaces leads to either compiling test code into your production binary, or other more-horrifying hacks (mocks!).