In itself, the practice is not bad. It's the code's intention that will determine whether or not your design choice is appropriate. When you think about it, that applies to pretty much every known coding patterns. You might as well have asked if using generic types or multithreading are good practices or not, the answer would've been the same.
There are non-static classes within the .NET framework that does use shared methods and within their own context it makes perfect sense. This alone should allow you to think it's not a bad practice at all.
All you have to do is simply questioning yourself about what you are trying to do and if whether it makes sense or not to do it in a static context.