I would say that static functions are useful in two situations (in C++.)
One is, as you have indicated yourself, in relation to singletons. The
other is for meta-programming. I will only address the latter below.
The static qualifier is often used in C++ traits. Normally, traits are
used to "bundle" types (e.g. a container could have both an interator
and a const_iterator type) and behavior associated with types. The
behavior has to be declared as static functions, such as
char_traits<T>::length described in the quotation below.
The C++ std::string class, for instance, is really a typedef for the
basic_string<char> template (and the std::wstring uses the same template
but with the wchar_t type instead.)
"Consider an example: when working with character strings, one common
operation is to determine the length of a null terminated string.
Clearly it's possible to write generic code that can do this, but it
turns out that there are much more efficient methods available: for
example, the C library functions strlen and wcslen are usually
written in assembler, and with suitable hardware support can be
considerably faster than a generic version written in C++. The
authors of the C++ standard library realized this, and abstracted
the properties of char and wchar_t into the class char_traits.
Generic code that works with character strings can simply use
char_traits<>::length to determine the length of a null terminated
string, safe in the knowledge that specializations of char_traits
will use the most appropriate method available to them."
This link contains a good description of C++ traits if you need more