Legal comments like authorship or copyright statements are necessary in code bases sometimes.
Informative comments like explaining what an abstract method returns, however it is preferable to have the function name describe this.
Explanation of intent comments like an author taking an interesting approach to a problem, you may not agree with the approach but at least you know what he is trying to do.
Clarification comments like translating the meaning of an obscure argument or return value. Although we should try to make this clear through code, we don't have much of a say if what we are using is not our code, so clarifying comments may be useful here.
Must ensure that our clarifying comments are in fact correct!
Warnings, it can be useful to warn users of potential risks of using a function or something of the sort.
TODO comments can be useful for notifying readers that a function is "in the works" or of a degenerative implementation that needs to be updated.
Amplification comments can be good to notify a reader that some code that may not seem important actually plays a large role.
Javadocs are very useful when writing a public API.
Mumbling comments are when you put in a comment just because you feel like you should, no real thought has gone into it.
Redundant comments are when the comment doesn't provide any value, useless reading... the code already describes itself.
Misleading comments are inaccurate comments or comments with misinformation or lack of information that can lead to incorrect or bad assumptions about the code.
Mandated comments are comments that are their for the sake of having a comment, like saying "every function needs a comment", this will just clutter the code base.
Journal comments are to keep track of edits but with version control systems now, these are redundant and not necessary. They're just clutter.
Noise comments are ones that restate the obvious and provide no valuable information.
Don't Use a Comment When You Can Use a Function or a Variable​