It's hard to answer this without knowing more details about what your program does or will do in the future, but I would agree this is probably not the way to go.
The point of having a single User class is so that you can access data and perform actions that make sense for all kinds of users, even users that happen to be Students, Instructors, Janitors and whatnot all at the same time (in some applications these may be genuinely mutually exclusive roles, but as you've pointed out it's not clear that they are in your case). For instance, bookAppointment([user1, user2, user3], time, place) probably makes sense for all kinds of Users, but calculateGPA(user) probably does not make any sense on non-Student Users. This implies that your User class should contain scheduling and location information in a format that works for all User types, but not any of the grading or exam information that simply doesn't make sense for a non-Student User. If you end up in a situation where you need the GPA but are only given a User, there should be an explicit "can I get a Student class corresponding to this User" step rather than a calculateGPA(User) method which just throws or returns null if the User is the wrong type, since that means you can't forget about handling the non-Student case properly.
The big question that I probably cannot answer is whether Student and Instructor should be subclasses of User, or largely separate types that are retrieved using some IDs in the User class when needed for specific operations.
The benefit of making them subclasses is that if and when you want different behavior for different types of Users, you just use polymorphism. For instance, let's pretend you want bookAppointment([user1, user2], nextSaturday) to fail if the users are Students but not if the users are Instructors. I would expect this to involve a method like User.getDefaultAvailability(day) which for Students returns false on weekends and for Instructors returns true.
The downside of making them subclasses is that you can never have a User of multiple types without running into all the usual problems with multiple inheritance. This is fine if you can be sure you'll never need a User to be both types at once (e.g., even if someone ends up having both roles in the real world, they'd just be given two separate user accounts). If not, it may be better to give User some nullable StudentID/InstructorID/etc fields, then have User.getDefaultAvailability() explicitly check which of these IDs are null to decide whether to call isWeekend(day) or just return true. This way you can explicitly decide which ruleset to apply when a User does fit multiple types, rather than being constrained by how your language handles MI (if it handles it at all).
P.S. I am assuming that adding a new type of user will be very rare, and if it does happen it'll come with some very non-trivial requirements, such that arguments about whether you can write a new type-of-user class without modifying the User class aren't terribly important.