В C# для этого обычно используют структуру без полей. Маркер, считай. И создают её через new constraint там, где надо. А функции, требующие инстанс тайпкласса, параметризуют этим инстансом.
В Java так просто уже не получится, но можно просто передавать его везде явно, наверное?
Prelude.sum<IntSumMonoid, Integer>(new IntSumMonoid(), 1, 2);
В Scala оно вот так вот примерно под капотом и работает, просто инстансы в основном передаются неявно.