Never use the keyword static. Well of course when you are making extension methods. Otherwise don't.
Statics are hard-coding your dependency and killing OOP (you don't operate with instances). Instead use dependency injection.
Caches are a seemingly naturally implemented using statics. Don't! You get more flexibility by avoiding this implementation strategy and you can let some one else handle the eviction strategy. Often that some one has a better idea about the eviction strategy based on the use-scenario rather than a generic cache class.
Sometimes I see people make method static when the methods do not access state on the object. Resharper also encourages you. Again don't follow this practice. If your method is not accessing any state on the object, it may be a hint that the method does not belong to that class. Don't make such methods static as they will hurt you when the code evolves.
Configuration is often tutored at candidates for static. Check out the project https://github.com/kbilsted/StatePrinter which doesn't use static for configuration. This allows me to use different configurations when running my tests in parallel.