Ultimately that boils down to the fact that when you have something like this:
class Me { public static void go() { System.out.println("going"); } }
These both would be allowed:
Me.go(); Me meAgain = new Me(); meAgain.go(); // with a warning here
Intersting is that this would work too for example:
Me meAgain = null; meAgain.go();
Personally I still see this as design flaw that could not be retracted due to compatibility - but I wish the compiler would not allow me to access the static method from an instance.
Your first question is not related to java-8 per-se, it has been like this before java-8:
interface ITest { public void go(); } class Test implements ITest { public static void go() { // fails to compile } }
default methods just follow the same rule here. Why this happens is actually detailed quite a lot on stack overflow - but the underlying idea is that potentially this would cause confusion on which method to call (imagine ITest would be a class that Test would extends and you do ITest test = new Test(); test.go(); -> which method are you calling?)
I think that for the same reasons this is not allowed also (which is basically your second question, otherwise you would have a static and non-static method with the same signatures)
static class Me { static void go() { } void go() { } }
It's interesting that this is sort of fixed (I guess that they realized it would be really bad to do the same mistake again) in method references:
static class Mapper { static int increment(int x) { return x + 1; } int decrement(int x) { return x - 1; } } Mapper m = new Mapper(); IntStream.of(1, 2, 3).map(m::increment); // will not compile IntStream.of(1, 2, 3).map(m::decrement); // will compile