Basic Singly Linked List Implementation
I think it's looking pretty good so far!

A few things,

I would make the Node class private. This is an implementation detail and nobody using your list should need to know or worry about it. I would also remove any public facing methods that return a Node over a T. If you want them internally you can make them private. (The built in Java LinkedList uses a private Node class but we don't need to worry about it)

You could remove a lot of boiler plate getters and setters by making the Node class private. You can access the fields directly within your SinglyLinkedList class.

When someone passes in a bad index, I would prefer and IndexOutOfBoundsException over IllegalArgumentException. (this is what java.util.Lists do afterall)

As well as this, I'd also like to see a more descriptive exception message. Maybe say which index was used, and what the current size is of the list.

You've overridden equals and hashCode in your node class which is usually a good thing to do in general, but here you don't really need it. However you may like to keep it if you end up adding additional functionality that may rely on it.

I think special casing index 0 is perfectly fine. 2 distinct things happen depending on it being the first element or any subsequent one.

A nice toString method would also be good here, you could just use a StringBuilder or StringJoiner to do this easily.