diff --git a/sqlparse/sql.py b/sqlparse/sql.py
index 586cd21..1ccfbdb 100644
--- a/sqlparse/sql.py
+++ b/sqlparse/sql.py
@@ -413,27 +413,28 @@ class Statement(TokenList):
         Whitespaces and comments at the beginning of the statement
         are ignored.
         """
-        first_token = self.token_first(skip_cm=True)
-        if first_token is None:
+        token = self.token_first(skip_cm=True)
+        if token is None:
             # An "empty" statement that either has not tokens at all
             # or only whitespace tokens.
             return 'UNKNOWN'
 
-        elif first_token.ttype in (T.Keyword.DML, T.Keyword.DDL):
-            return first_token.normalized
+        elif token.ttype in (T.Keyword.DML, T.Keyword.DDL):
+            return token.normalized
 
-        elif first_token.ttype == T.Keyword.CTE:
+        elif token.ttype == T.Keyword.CTE:
             # The WITH keyword should be followed by either an Identifier or
             # an IdentifierList containing the CTE definitions;  the actual
             # DML keyword (e.g. SELECT, INSERT) will follow next.
-            fidx = self.token_index(first_token)
-            tidx, token = self.token_next(fidx, skip_ws=True)
-            if isinstance(token, (Identifier, IdentifierList)):
-                _, dml_keyword = self.token_next(tidx, skip_ws=True)
-
-                if dml_keyword is not None \
-                        and dml_keyword.ttype == T.Keyword.DML:
-                    return dml_keyword.normalized
+            tidx = self.token_index(token)
+            while tidx is not None:
+                tidx, token = self.token_next(tidx, skip_ws=True)
+                if isinstance(token, (Identifier, IdentifierList)):
+                    tidx, token = self.token_next(tidx, skip_ws=True)
+
+                    if token is not None \
+                            and token.ttype == T.Keyword.DML:
+                        return token.normalized
 
         # Hmm, probably invalid syntax, so return unknown.
         return 'UNKNOWN'

diff --git a/tests/test_regressions.py b/tests/test_regressions.py
index 4ffc69f..bc8b7dd 100644
--- a/tests/test_regressions.py
+++ b/tests/test_regressions.py
@@ -427,3 +427,12 @@ def test_splitting_at_and_backticks_issue588():
         'grant foo to user1@`myhost`; grant bar to user1@`myhost`;')
     assert len(splitted) == 2
     assert splitted[-1] == 'grant bar to user1@`myhost`;'
+
+
+def test_comment_between_cte_clauses_issue632():
+    p, = sqlparse.parse("""
+        WITH foo AS (),
+             -- A comment before baz subquery
+             baz AS ()
+        SELECT * FROM baz;""")
+    assert p.get_type() == "SELECT"

Statement.get_type() does not skip comments between subqueries.
SQL query can contain comment in between WITH multiple query but the `get_type()` implementation doesn't skip them

```python
>>> query, = sqlparse.parse("""
WITH A AS (),
          -- A comment about the B subquery...
          B AS ()
SELECT * FROM B
""")
>>> query.get_type()
'UNKNOWN'
```

Without the comment:

```python
>>> query, = sqlparse.parse("""
WITH A AS (),
          B AS ()
SELECT * FROM B
""")
>>> query.get_type()
'SELECT'
```
tests/test_regressions.py::test_comment_between_cte_clauses_issue632
tests/test_regressions.py::test_issue9 tests/test_regressions.py::test_issue13 tests/test_regressions.py::test_issue26[--hello] tests/test_regressions.py::test_issue26[-- tests/test_regressions.py::test_issue26[--hello\n] tests/test_regressions.py::test_issue26[--] tests/test_regressions.py::test_issue26[--\n] tests/test_regressions.py::test_issue34[create] tests/test_regressions.py::test_issue34[CREATE] tests/test_regressions.py::test_issue35 tests/test_regressions.py::test_issue38 tests/test_regressions.py::test_issue39 tests/test_regressions.py::test_issue40 tests/test_regressions.py::test_issue78[get_name-z-select tests/test_regressions.py::test_issue78[get_real_name-y-select tests/test_regressions.py::test_issue78[get_parent_name-x-select tests/test_regressions.py::test_issue78[get_alias-z-select tests/test_regressions.py::test_issue78[get_typecast-text-select tests/test_regressions.py::test_issue83 tests/test_regressions.py::test_comment_encoding_when_reindent tests/test_regressions.py::test_parse_sql_with_binary tests/test_regressions.py::test_dont_alias_keywords tests/test_regressions.py::test_format_accepts_encoding tests/test_regressions.py::test_stream tests/test_regressions.py::test_issue90 tests/test_regressions.py::test_except_formatting tests/test_regressions.py::test_null_with_as tests/test_regressions.py::test_issue190_open_file tests/test_regressions.py::test_issue193_splitting_function tests/test_regressions.py::test_issue194_splitting_function tests/test_regressions.py::test_issue186_get_type tests/test_regressions.py::test_issue212_py2unicode tests/test_regressions.py::test_issue213_leadingws tests/test_regressions.py::test_issue227_gettype_cte tests/test_regressions.py::test_issue207_runaway_format tests/test_regressions.py::test_token_next_doesnt_ignore_skip_cm tests/test_regressions.py::test_issue284_as_grouping[SELECT tests/test_regressions.py::test_issue284_as_grouping[AS] tests/test_regressions.py::test_issue315_utf8_by_default tests/test_regressions.py::test_issue322_concurrently_is_keyword tests/test_regressions.py::test_issue359_index_error_assignments[SELECT tests/test_regressions.py::test_issue469_copy_as_psql_command tests/test_regressions.py::test_issue485_split_multi tests/test_regressions.py::test_issue489_tzcasts tests/test_regressions.py::test_issue562_tzcasts tests/test_regressions.py::test_as_in_parentheses_indents tests/test_regressions.py::test_format_invalid_where_clause tests/test_regressions.py::test_splitting_at_and_backticks_issue588