As for methods : every method Foo.method(Bar1 b1, Bar2, b2)
by definition could always have alternative equivalent designs:
Bar.altmethod(Foo f, Bar b2)
and
static staticMethod(Foo f, Bar b1, Bar b2)
And you could also wrap that latter method as an instance method in a service class which is itself a singleton (so that the static-ness of the method is a bit little bit concealed by the class it's in).
The only compelling reason to have your method as an instance method of the class of one of your method arguments (of the static version), is when you expect there to be subclasses for that class, and that it might be useful for those subclasses to have a specialized implementation of the method.
Imagine
class GeographicalFigure {
Object quadrature() { ... }
}
It might be useful to leave open the possibility of later adding
class Circle extends GeographicalFigure {
Object quadrature() {
throw new ThisIsNoGoodException();
}
}
Other than that, all your options are essentially equivalent.