I've improved my solution by:
==============================================================
template<class F>
void testEnum(const F & f)
{
    BOOST_STATIC_ASSERT(!boost::is_enum<boost::function_traits<boost::remove_pointer<F>::type >::result_type >::value);
}

template<void (*)()>
struct Dummy {
    static const bool value = true;
};

template <typename ContractType>
class C {
private:
    static void verify()
    {
        testEnum(&ContractType::st1);
        testEnum(&ContractType::st2);
    }
    BOOST_STATIC_ASSERT(Dummy<&C::verify>::value);
};
==============================================================

So the problem I noticed is solved.