A great technique is to modify the UI based on context and allowed actions. As I started using Basecamp (37signals) on a daily basis I realized that there are hardly any error messages in the application. If you aren't allowed to do something they hide any UI elements associated with the invalid action. This results in a simpler interface that is more intuitive.