Take a browse through the book Head-First Design Patterns... you'll see good arguments for using interfaces that have nothing to do with TDD or polymorphism.
Interfaces allow you to change an object's behavior at runtime... Think of places where you'd need a handler for a particular behavior, but might not know what behavior is needed until runtime. In the case of computing expenses for employees... Managers might have a higher allowance for 'entertainment' expenses than a regular employee.
If your Employee object has a reference to an IExpenseCalculator interface, you can assign it a manager's calculator or an employee's calculator at runtime. Calling Employee.GetExpenses() will give you a differently calculated result for a manager than for a regular employee. Internally, the code would look like this:
public class Employee {
private IExpenseCalculator expenses;
public ExpenseSheet GetExpenses() {
return expenses.CalcExpenses();
}
}
This example assumes that 'expenses' is exposed as a property, and that IExpenseCalculator has a method for CalcExpenses().
Interfaces are also closely tied to the concept of object factories... think database layer. When you've configured your data layer as a factory, you can create objects to connect to Sql Server, Oracle, or MySql dynamically, at runtime, based on configuration settings. But the client needs a concrete handle to the database layer object... enter Interfaces.
Interfaces are a powerful tool, one that is often misused. Using them properly will take a shift in your way of thinking, but can help your application structure tremendously.