Machine code(Not language) is the lowest level.
When programming in machine code one would use a switched front panel where there are switches representing the data. The switches would be set and then a button to load the data into memory.
Assemblers are just a different way of writing machine code.
Assemblers use the machine code mnemonics to write the code. And there is a one on one relationship between machine code and the assembler mnemonic.
A step up from assemblers are macro-assemblers which essentially abstract common code blocks such as pushing the registers before entering a sub routine and popping the registers after returning from subroutines.
Then we have interpreters and compilers,
Interpreters basically read an instruction, do it and then read the next instruction. Compilers read the code several times and usually generate byte code or machine code which is stored in a file which is executed.
Some languages run as interpreters but when running generate byte code which is saved resulting in the code executing faster on the second and subsequent execution. An example of this is IBMs REXX which, at least it used to, run on every IBM computer model, even the IBM PC.
Datatypes are not restricted to higher level languages as even machine code has data types Signed and unsigned integers, characters, binary coded decimal numbers, octal and hex numbers as well as multibyte numbers. Plus whatever the programmer wants to envision.
I am not particularly a student of such things, but the only other interesting taxonomy I can think of would be categorizing languages by their intended or typical use. We have languages typically used for web development, languages used for financial services, languages used in embedded systems, etc. They are in those categories because they have characteristics that are useful in those fields (speed, connectivity to databases, availability and integration with 3rd party components, abstraction from hardware, etc).
By the way “abstraction” would include any capability that is not a direct mapping to an implementation in the native processor (i.e. your machine language), and not only includes higher level data types, but also objects, control structures, etc.
Yes machine language and assemblers are essentially the same.
The original Basic in the original IBM PC is much like that. It was optionally stored in a binary format and executed from that. Microsoft did make a version of C++ that compiled into a p-code, something like that. I suspect, and I have seen nothing saying it, that that technology was used for .Net.
And yes REXX is available for Windows. I had it installed but never used it in my PC (I used it more than a quarter century ago for IBM Mainframe programming).