Some algorithms need to perform a lot of squaring operations (e.g. elliptic curve crypto). Squaring can be implemented in approximately half the number of primitive multiplications as general multiplication code.
BigInteger has that code internally but it is not accessible by applications. To change that, the multiply(BigInteger val) code should include a this.equals(val) check and use the squaring code if so.